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