国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux網絡服務器epoll模型的socket通訊的實現(一)

2024-06-28 13:27:36
字體:
來源:轉載
供稿:網友
linux網絡服務器epoll模型的socket通訊的實現(一)
  準備寫一個網絡游戲的服務器的通訊模塊,參考網上看到的一些代碼,在linux下面實現一個多線程的epoll模型的socket通訊的代碼,以下是第一部分多線程的切換代碼:  1 #include <stdio.h>  2 #include <sys/types.h>  3 #include <sys/epoll.h>  4 #include <sys/socket.h>  5 #include <signal.h>  6 #include <fcntl.h>  7 #include <map>  8 #include <errno.h>  9 #include <pthread.h> 10 #include <stdlib.h> 11 #include <unistd.h> 12 using namespace std; 13  14 struct conninfo{ 15     int rfd; 16     int wfd; 17     //map<struct ipport, struct perrinfo> peer; 18 }; 19  20 bool g_bRun; 21  22 struct conninfo g_ConnInfo; 23  24 void setnonblocking(int sock) 25 { 26     int opts; 27     opts = fcntl(sock, F_GETFL); 28     if(opts < 0) 29     { 30         PRintf("fcntl(sock, GETFL)"); 31         exit(1); 32     } 33     opts = opts | O_NONBLOCK; 34     if(fcntl(sock, F_SETFL, opts) < 0) 35     { 36         printf("fcntl(sock, SETFL, opts)"); 37         exit(1); 38     } 39     return ; 40 } 41  42 static void sig_pro(int signum) 43 { 44     printf("sig_pro recv signal: %d/n", signum); 45     if(signum == SIGQUIT) 46     { 47         g_bRun = false; 48     } 49 } 50  51 void* AcceptThread(void* arg) 52 { 53     printf("accpet thread/n"); 54     return NULL; 55 } 56  57 void* ReadThread(void* arg) 58 { 59     printf("read thread/n"); 60     return NULL; 61 } 62  63 int main() 64 { 65     int ret; 66     int fd[2];  //pipe 67     pthread_t iAcceptThreadId; 68     pthread_t iReadThreadId; 69  70     struct sigaction sa; 71     sa.sa_flags = SA_RESTART; 72     sa.sa_handler = sig_pro; 73     sigaction(SIGINT, &sa, NULL); 74     sigaction(SIGUSR1, &sa, NULL); 75     sigaction(SIGUSR2, &sa, NULL); 76      77  78     g_bRun = true; 79     ret = pipe(fd); 80     if(ret < 0) 81     { 82         printf("main, pipe fall, %d %s/n", ret, errno); 83         g_bRun = false; 84         return 0; 85     } 86      87     g_ConnInfo.rfd = fd[0]; 88     g_ConnInfo.wfd = fd[1]; 89  90     setnonblocking(g_ConnInfo.rfd); 91      92     pthread_attr_t attr; 93     pthread_attr_init(&attr); 94     pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); 95  96     ret = pthread_create(&iAcceptThreadId, &attr, AcceptThread, NULL); 97     if(ret != 0) 98     { 99         printf("main, create accept thread fail: %s/n", errno);    100         g_bRun = false;101         close(g_ConnInfo.rfd); //關閉管道102         close(g_ConnInfo.wfd);103         return 0;104     }105     106     ret = pthread_create(&iReadThreadId, &attr, ReadThread, NULL);107     if(ret != 0)108     {109         printf("main, create read thread fail: %s/n", errno);110         g_bRun = false;111         pthread_join(iAcceptThreadId, NULL);112         close(g_ConnInfo.rfd);    113         close(g_ConnInfo.wfd);114         115         return 0;116     }117     118     while(g_bRun)119     {120         sleep(1);121     }122 123     pthread_join(iAcceptThreadId, NULL);  //收回線程的資源,銷毀線程124     pthread_join(iReadThreadId, NULL);125     close(g_ConnInfo.rfd);126     close(g_ConnInfo.wfd);127 128     return 0;    129 }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新泰市| 盈江县| 会宁县| 彭阳县| 贵州省| 云阳县| 陈巴尔虎旗| 原阳县| 德阳市| 仪陇县| 新晃| 象山县| 阳新县| 兴业县| 马尔康县| 嘉禾县| 阜阳市| 安徽省| 博湖县| 钟祥市| 桐乡市| 南城县| 淳化县| 佳木斯市| 小金县| 灵台县| 福海县| 通河县| 河南省| SHOW| 吐鲁番市| 永平县| 哈尔滨市| 河西区| 三亚市| 榆树市| 大丰市| 平陆县| 东光县| 巢湖市| 台州市|