服务器端代码
1 /*服务器端*/
2
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <arpa/inet.h>
7 #include <netinet/in.h>
8 #include <errno.h>
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #define BUF "Hello client ,I'm server!"
12
13 int main(int argc, char **argv)
14 {
15 int server_fd = -1;
16 int client_fd = -1;
17 int rv = -1;
18 int port = 9999;
19 struct sockaddr_in server_addr;
20 struct sockaddr_in client_addr;
21 char buff[1024] = {};
22 int on = 1;
23 socklen_t *client_addrlen;
24 server_fd = socket(AF_INET, SOCK_STREAM, 0);
25 if(server_fd < 0)
26 {
27 printf("create socket failure!\n");
28 return -1;
29 }
30 printf("create socket[%d]successfully!\n",server_fd);
31
32 setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
33 memset(&server_addr, 0,sizeof(server_addr));
34 server_addr.sin_family = AF_INET;
35 server_addr.sin_port = htons(port);
36 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
37 rv = bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
38 if(rv < 0)
39 {
40 printf("server_fd[%d]bind[%d]failure:%s\n", server_fd,port,strerror(errno));
41 return -2;
42 }
43 printf("server_fd[%d]bind[%d]successfully!\n", server_fd,port);
44
45 if((listen(server_fd,13)) < 0)
46 {
47 printf("server_fd[%d]listen[%d]failure:%s\n",server_fd, port,strerror(errno));
48 return -3;
49 }
50 printf("server_fd[%d]listen[%d]successfully!\n",server_fd, port);
51
52 while(1)
53 {
54 printf("start accept new client connect······\n");
55
56 memset(&client_addr,0,sizeof(client_addr));
57 memset(client_addrlen,0,sizeof(client_addrlen));
58 printf("1\n");
59 //当客户端连接服务器的时候,触发accept,accept从内核中拿出客户端的IP地址和h端口,将其放到client_addr这个结构体里面
60 client_fd = accept(server_fd,(struct sockaddr *)&client_addr,client_addrlen);
61 if(client_fd < 0)
62 {
63 //inet_ntoa函数返回的是点分十进制的字符串在静态内存中的指针,这里是将客户端的IP地址从client_addr这个结构体中拿出来,这里我们要知道clien t_addr结构体是struct sockaddr_in类型的结构体
64 //ntohs函数作用是将一个16位数由网络字节顺序转换为主机字节顺序,这里是将我们客户端的端口转化为主机字节序
65 //这俩个函数刚好跟客户端代码里的inet_aton和htons相对应 ,功能相反。
66 printf("accept new client[%d][%s:%d]fail:%s\n",client_fd, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),strerror(errno));
67 printf("%s\n",strerror(errno));
68 break;
69 }
70 printf("accept new client[%d][%s:%d]successfully!\n",client_fd, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
71 memset(buff,0,sizeof(buff));
72 rv = read(client_fd, buff, sizeof(buff));
73 if(rv < 0)
74 {
75 printf("read data from client[%d]failure is:%s\n",client_fd,strerror(errno));
76 break;
77 }
78 printf("read data from client[%d]successful is :%s!\n",client_fd, buff);
79
80 rv = write(client_fd, BUF, strlen(BUF));
81 if(rv < 0)
82 {
62,1-8 80%
客户端代码
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <string.h>
5 #include <errno.h>
6 #include <arpa/inet.h>
7 #include <sys/socket.h>
8 #include <arpa/inet.h>
9 #include <stdlib.h>
10
11 #define SEND_MSG "hello server,I'm client"
12
13 int main(int argc, char **argv)
14 {
15 int socket_fd = -1;
16 int rv = -1;
17 struct sockaddr_in server_addr;
18 char *server_ip;
19 int PORT;
20 char buff[1024]={};
21
22 server_ip = argv[1];
23 PORT = atoi(argv[2]);
24
25 socket_fd = socket(AF_INET, SOCK_STREAM, 0 );
26 if(socket < 0)
27 {
28 printf("create socket_fd failure:%s\n",strerror(errno));
29 return -1;
30 }
31 printf("create socket_fd successfully!\n");
32 memset(&server_addr, 0, sizeof(server_addr));
33 server_addr.sin_family = AF_INET; //使用是ipv4地址,所以用AF_INET
34 server_addr.sin_port = htons(PORT); //将端口转换为网络字节序
35 inet_aton(server_ip, &server_addr.sin_addr); //将server_ip所指向的十进制地址转换为网络地址
36
37 rv = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
38 if(rv < 0)
39 {
40 printf("socket_fd[%d]connect[%s:%d] failure!\n",socket_fd,server_ip,PORT);
41 return -2;
42 }
43
44 printf("connect[%s:%d]successfully\n",server_ip,PORT);
45 rv = write(socket_fd, SEND_MSG, strlen(SEND_MSG));
46 if(rv < 0)
47 {
48 printf("Send data failure\n");
49 return -3;
50 }
51 printf("Send data successful:%s\n",SEND_MSG);
52
53 memset(&buff, 0, sizeof(buff));
54 rv = read(socket_fd, buff, sizeof(buff)) ;
55 if(rv < 0)
56 {
57 printf("recv data from server failure!\n");
58 return -4;
59 }
60 else if(rv = 0)
61 {
62 printf("disconnect\n");
63 return -5;
64 }
65
66 printf("recv data from server is:%s\n",buff);
67 close(socket_fd);
68
69 }