linux tcp 通信 读写线程
查看进程的线程数
1.查找到进程的pid
2.top -H -p pid
服务端
#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> #include<thread> #define MAXLINE 4096
void *do_read(void *fdArg) { int listenfd = (int)(*((int *)fdArg)); char buff[4096]; int n = 0; while(1) { memset(buff, 0, 4096); n = recv(listenfd, buff, MAXLINE, 0); buff[n] = '\0'; if(strlen(buff) > 2) { printf("recv msg from client: %s\n", buff); } } return NULL; } void *do_write(void *fdArg) { int listenfd = (int)(*((int *)fdArg)); char buff[4096]; int n = 0; while(1) { memset(buff, 0, 4096); fgets(buff, 4096, stdin); if(strlen(buff)) { printf("send msg to client: %s\n", buff); if(send(listenfd, buff, strlen(buff), 0) < 0){ printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); } } } return NULL; } int main(int argc, char** argv){ int listenfd, connfd; struct sockaddr_in servaddr; // 创建套接字 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); /* 设置复用模式 */ int opt = SO_REUSEADDR; if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) { printf("setsockopt"); return -1; } // 绑定套接字 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"); int ret_read, ret_write; pthread_t thread_read, thread_write; while(1){ // 产生通信套接字 if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } else { ret_read = pthread_create(&thread_read, NULL, do_read, &connfd); ret_write = pthread_create(&thread_write, NULL, do_write, &connfd); pthread_join(thread_read, NULL); pthread_join(thread_write, NULL); close(connfd); printf("close communicate socket.\n"); } } close(listenfd); printf("close listen socket.\n"); return 0; }
客户端
#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> #include<pthread.h> #define MAXLINE 4096
void *do_read(void *fdArg) { int fd = (int)(*((int *)fdArg)); char buff[4096]; int n = 0; while(1) { memset(buff, 0, 4096); n = recv(fd, buff, MAXLINE, 0); buff[n] = '\0'; if(strlen(buff) > 2) { printf("recv msg from server: %s\n", buff); } } return NULL; } void *do_write(void *fdArg) { int fd = (int)(*((int *)fdArg)); char buff[4096]; int n = 0; while(1) { memset(buff, 0, 4096); fgets(buff, 4096, stdin); if(strlen(buff)) { printf("send msg to server: %s\n", buff); if(send(fd, buff, strlen(buff), 0) < 0){ printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); } } } return NULL; } int main(int argc, char** argv){ int sockfd; 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; } // 通信 int ret_read, ret_write; pthread_t thread_read, thread_write; ret_read = pthread_create(&thread_read, NULL, do_read, &sockfd); ret_write = pthread_create(&thread_write, NULL, do_write, &sockfd); pthread_join(thread_read, NULL); pthread_join(thread_write, NULL); close(sockfd); printf("close communicate socket.\n"); return 0; }

浙公网安备 33010602011771号