linux 简单 tcp 通信
server
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<unistd.h> #include<iostream> #define MAXLINE 4096 int main(int argc, char** argv){ int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n = 0; // 创建套接字 if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); // 绑定套接字 if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } // 监听套接字 if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); return 0; } // 准备通信 printf("======waiting for client's request======\n"); while(1){ // 产生通信套接字 if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } while(1) { memset(buff, 0, 4096); n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; if(strlen(buff) > 2) { printf("recv msg from client: %s\n", buff); } if(strlen(buff) == 1) { break; } } close(connfd); // 客户端和服务端任意一端关闭即可 printf("close communicate socket.\n"); } close(listenfd); printf("close listen socket.\n"); return 0; }
client
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #define MAXLINE 4096 int main(int argc, char** argv){ int sockfd, n; char recvline[4096], sendline[4096]; struct sockaddr_in servaddr; // 对参数个数进行判断 if( argc != 2){ printf("usage: ./client <ipaddress>\n"); return 0; } // 输出参数列表 for(int i = 0; i < argc; i++) { std::cout << "argv[" << i << "]" << argv[i] << std::endl; } // 创建套接字 if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); return 0; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf("inet_pton error for %s\n",argv[1]); return 0; } // 连接服务端 if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ printf("connect error: %s(errno: %d)\n",strerror(errno),errno); return 0; } // 通信 while(1) { printf("send msg to server: \n"); memset(sendline, 0, 4096); fgets(sendline, 4096, stdin); if(strlen(sendline)) { if(send(sockfd, sendline, strlen(sendline), 0) < 0){ printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); } } if(strlen(sendline) == 1) { break; } } close(sockfd); printf("close communicate socket.\n"); return 0; }

浙公网安备 33010602011771号