1. 程式人生 > >Linux C++ TCP Socket通信實例

Linux C++ TCP Socket通信實例

內容 set color 分享 int clas 打開 makefile src

環境:Linux

語言: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

Linux C++ TCP Socket通信實例