Linux socket学习

技术分享

 1 //服务器端 server.c
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<errno.h>
 6 #include<sys/types.h>
 7 #include<sys/socket.h>
 8 #include<netinet/in.h>
 9 #define MAXLINE 4096
10 
11 //socket(int domain, int type, int protocol)
12 //         协议域      socket类型    指定协议
13 int main(int argc, char **argv)
14 {
15     int n, listenfd, connfd;
16     struct sockaddr_in servaddr;
17     char buff[MAXLINE];
18     if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
19     {
20         printf("create socket error:%s(error:%d)\n",strerror(errno),errno);
21         exit(0);
22     }
23     memset(&servaddr, 0, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //系统绑定默认的网卡即IP地址
26     servaddr.sin_port = htons(6666); //监听本机的6666号端口
27 
28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
29     { //把一个地址族中的特定地址赋给socket
30         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
31         exit(0);
32     }
33     if( listen(listenfd, 10) == -1)
34     { //调用listen()监听socket
35         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
36         exit(0);
37     }
38     printf("waiting for client‘s request...\n");
39     while(1)
40     {
41         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
42         { //调用accept()函数取接收请求,连接建立好
43             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
44             continue;
45         }
46         n = recv(connfd, buff, MAXLINE, 0); //recv函数返回其实际copy的字节数
47         buff[n] = \0;
48         printf("recv msg from client: %s\n", buff);
49         close(connfd);
50     }
51     close(listenfd);
52 }
 1 //客户端 client.c
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<errno.h>
 6 #include<sys/types.h>
 7 #include<sys/socket.h>
 8 #include<netinet/in.h>
 9 #define MAXLINE 4096
10 
11 int main(int argc, char** argv)
12 {
13     int  n, sockfd;
14     char recvline[MAXLINE], sendline[MAXLINE];
15     struct sockaddr_in servaddr;
16     if( argc != 2)
17     {
18         printf("usage: ./client <ipaddress>\n");
19         exit(0);
20     }
21     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
22     {
23         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
24         exit(0);
25     }
26     memset(&servaddr, 0, sizeof(servaddr));
27     servaddr.sin_family = AF_INET;
28     servaddr.sin_port = htons(6666);
29 
30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
31     { //IP地址转换函数
32         printf("inet_pton error for %s\n",argv[1]);
33         exit(0);
34     }
35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
36     { //调用connect()发出连接请求
37         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
38         exit(0);
39     }
40     printf("send msg to server: \n");
41     fgets(sendline, 4096, stdin);
42     if( send(sockfd, sendline, strlen(sendline), 0) < 0)
43     {
44         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
45         exit(0);
46     }
47     close(sockfd);
48     exit(0);
49 }

分别用gcc编译好后执行,开2个终端:

技术分享

技术分享

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。