Linux C++ TCP Socket通信實例
阿新 • • 發佈:2018-08-08
內容 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, (structsockaddr*)&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通信實例