首页 > 代码库 > Linux下使用多线程模拟异步网络通信
Linux下使用多线程模拟异步网络通信
服务器
/* socket server * 2014-12-15 CopyRight (c) arbboter */#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <sys/socket.h>#include <sys/types.h>#include <netdb.h>#include <string.h>#include <arpa/inet.h>#include <pthread.h>#include <vector>using namespace std;vector<int> vecClient;// 线程同步锁pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* recv_thr(void*p);void* send_thr(void*p);int main(){ int sockfd_server; int sockfd_client; struct sockaddr_in addr_server; struct sockaddr_in addr_client; socklen_t addr_len = 0; int client_max = 10; int server_port = 33891; srand(time(NULL)); // create socket sockfd_server = socket(AF_INET, SOCK_STREAM, 0); if(sockfd_server == -1) { printf("init socket failed\n"); return -1; } // set address memset(&addr_server, 0, sizeof(addr_server)); addr_server.sin_family = AF_INET; addr_server.sin_addr.s_addr = htonl(INADDR_ANY); addr_server.sin_port = htons(server_port); // socket bind with address if(bind(sockfd_server, (struct sockaddr*)&addr_server, sizeof(struct sockaddr)) == -1) { printf("bind socket failed\n"); return -1; } // server socket start list, waitting client to connect // 这个client_max是指同时连接数 if(listen(sockfd_server, client_max) == -1) { printf("start listen socket failed\n"); return -1; } // 数据线程 pthread_t tid = 0; pthread_create(&tid, NULL, send_thr, NULL); while(1) { addr_len = sizeof(struct sockaddr_in); printf("waitting for connected...\n"); // waitting for connected sockfd_client = accept(sockfd_server, (struct sockaddr*)&addr_client, &addr_len); if(sockfd_client == -1) { printf("accept socket failed\n"); return -1; } // create a thread to talk with client printf("recived connection from : %s\n", inet_ntoa(addr_client.sin_addr)); pthread_create(&tid, NULL, recv_thr, (void*)&sockfd_client); // 加到发数据对象集合中 pthread_mutex_lock(&mutex); vecClient.push_back(sockfd_client); pthread_mutex_unlock(&mutex); } close(sockfd_server); pthread_mutex_destroy(&mutex); return 0;}// 收数据void* recv_thr(void*p){ int fd = *((int*)p); int nRead = 0; char szBuf[512] = {0}; while(1) { memset(szBuf, 0, sizeof(szBuf)); nRead = read(fd, szBuf, sizeof(szBuf)); printf("client : %s\n", szBuf); if(strcmp(szBuf, "quit") == 0) { break; } sprintf(szBuf, "Your magic number is : %d", rand()%100); printf("server : %s\n", szBuf); write(fd, szBuf, strlen(szBuf)); } return NULL;}// 发数据void* send_thr(void*p){ size_t i = 0; char szBuf[512] = {0}; while(1) { sleep(rand()%10); pthread_mutex_lock(&mutex); for(int i=0; i<vecClient.size(); i++) { sprintf(szBuf, "Your magic number is : %d", rand()%100); printf("[%02d] server : %s\n", i, szBuf); write(vecClient[i], szBuf, strlen(szBuf)); } pthread_mutex_unlock(&mutex); } return NULL;}
客户端
/* socket client * 2014-12-15 CopyRight (c) arbboter */#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <netdb.h>#include <string.h>#include <arpa/inet.h>#include <pthread.h>#include <signal.h>#include <errno.h>#include <string.h>void* recv_thr(void*p);int main(){ int sockfd_server; struct sockaddr_in addr_server; socklen_t addr_len = 0; int server_port = 33891; char* server_addr = "192.168.2.200"; // create socket sockfd_server = socket(AF_INET, SOCK_STREAM, 0); if(sockfd_server == -1) { printf("init socket failed\n"); return -1; } // set server address memset(&addr_server, 0, sizeof(addr_server)); addr_server.sin_family = AF_INET; addr_server.sin_addr.s_addr = inet_addr(server_addr);; addr_server.sin_port = htons(server_port); // connect server if(connect(sockfd_server,(struct sockaddr *)&addr_server,sizeof(struct sockaddr))==-1) { printf("connect server failed\n"); return -1; } // 启动收数据线程 pthread_t tid = 0; pthread_create(&tid, NULL, recv_thr, (void*)&sockfd_server); // 发送数据 char szBuf[512] = {0}; int nLen = 0; while(1) { // 收线程已退出 if( ESRCH == pthread_kill(tid,0) ) { break; } // 等待输入数据 gets(szBuf); nLen = strlen(szBuf); if(nLen > 0) { szBuf[nLen] = ‘\0‘; write(sockfd_server, szBuf, nLen); } } close(sockfd_server); return 0;}// 收数据void* recv_thr(void*p){ int fd = *((int*)p); int nRead = 0; char szBuf[512] = {0}; while(1) { memset(szBuf, 0, sizeof(szBuf)); nRead = read(fd, szBuf, sizeof(szBuf)); printf("server : %s\n", szBuf); if(strcmp(szBuf, "quit") == 0) { break; } } return NULL;}
Linux下使用多线程模拟异步网络通信
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。