Linux C/C++ TCP Socket通信实例

环境:Linux

语言:C/C++

通信方式:TCP

  下面用TCP协议编写一个简单的服务器、客户端,其中服务器端一直监听本机的6666号端口。如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。

server.cpp

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<unistd.h>
 9 
10 #define MAXLINE 4096
11 
12 int main(int argc, char** argv){
13     int  listenfd, connfd;
14     struct sockaddr_in  servaddr;
15     char  buff[4096];
16     int  n;
17 
18     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
19         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
20         return 0;
21     }
22 
23     memset(&servaddr, 0, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
26     servaddr.sin_port = htons(6666);
27 
28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
29         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
30         return 0;
31     }
32 
33     if( listen(listenfd, 10) == -1){
34         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
35         return 0;
36     }
37 
38     printf("======waiting for client's request======\n");
39     while(1){
40         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
41             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
42             continue;
43         }
44         n = recv(connfd, buff, MAXLINE, 0);
45         buff[n] = '\0';
46         printf("recv msg from client: %s\n", buff);
47         close(connfd);
48     }
49     close(listenfd);
50     return 0;
51 }

 client.cpp

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<arpa/inet.h>
 9 #include<unistd.h>
10 #define MAXLINE 4096
11 
12 int main(int argc, char** argv){
13     int   sockfd, n;
14     char  recvline[4096], sendline[4096];
15     struct sockaddr_in  servaddr;
16 
17     if( argc != 2){
18         printf("usage: ./client <ipaddress>\n");
19         return 0;
20     }
21 
22     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
23         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
24         return 0;
25     }
26 
27     memset(&servaddr, 0, sizeof(servaddr));
28     servaddr.sin_family = AF_INET;
29     servaddr.sin_port = htons(6666);
30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
31         printf("inet_pton error for %s\n",argv[1]);
32         return 0;
33     }
34 
35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
36         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
37         return 0;
38     }
39 
40     printf("send msg to server: \n");
41     fgets(sendline, 4096, stdin);
42     if( send(sockfd, sendline, strlen(sendline), 0) < 0){
43         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
44         return 0;
45     }
46     close(sockfd);
47     return 0;
48 }

makefile

 1 all:server client
 2 server:server.o
 3     g++ -g -o server server.o
 4 client:client.o
 5     g++ -g -o client client.o
 6 server.o:server.cpp
 7     g++ -g -c server.cpp
 8 client.o:client.cpp
 9     g++ -g -c client.cpp
10 clean:all
11     rm all

   执行make命令后,生成server和client两个可执行文件。分别打开两个终端窗口,一个执行./server命令,一个执行./client 127.0.0.1命令,表示连上本机的6666端口,执行./server命令的要先执行。执行./client 127.0.0.1命令后,会提示说要发给server的内容,输入“hello”后,client客户端执行完毕,这时可以看到server的那个终端窗口输出“recv msg from client: hello”。继续执行./client 127.0.0.1命令后,再输入“haha”,server的终端继续输出“recv msg from client: haha”。结果如图所示。

TCP协议通信交互流程:

    

参考文献:

《后台开发:核心技术与应用实践》第六章,p206

posted on 2018-08-08 10:48  zkfopen  阅读(45150)  评论(3编辑  收藏  举报

导航