准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在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 }

转载于:https://www.cnblogs.com/jiangwang2013/p/3581526.html

Linux网络服务器epoll模型的socket通讯的实现(一)相关推荐

  1. linux线程同步 epoll,Linux网络编程--epoll 模型原理详解以及实例

    1.简介 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux 2.6内核中有提高网络I/O性能的新方法,即epoll . epoll是什么?按 ...

  2. Netty入门笔记-Linux网络I/O模型介绍

    在之前的博客中并没有将关于Netty的知识系统的总结起来.从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家 ...

  3. java IO初识与Linux网络I/O模型简介

    Java的 I/O发展简史 从 JDK1.0到 JDK1.3, Java的 I/O类库都非常原始,很多 UNIX网络编程中的概念或接口在l/O类库中都没有体现,例如 Pipe. Channel. Bu ...

  4. 高性能服务器设计——常用网络服务器设计模型(转载)

    文章来源:http://blog.csdn.net/jiang1013nan/article/details/17471341 在业务服务开发过程中,一个优秀的开发框架,往往能够起到事半功倍的效果.现 ...

  5. linux网络编程(二)TCP通讯状态

    linux网络编程(二)TCP通讯状态 TCP状态转换 为什么需要等待2MSL? 端口复用 TCP状态转换 tcp协议连接开始会经过三次握手,客户端和服务器开始都会处于CLOSED状态 第一次握手:客 ...

  6. LinuxI/O多路复用转接服务器——epoll模型实现

    LinuxI/O多路复用转接服务器--epoll模型实现 epoll函数 epoll函数组 epoll_create函数 epoll_ctl函数 epoll_wait函数 epoll实现实现I/O多路 ...

  7. Linux - 网络服务器开发(全)

    文章目录 Linux - 网络服务器开发(Ubuntu) Linux - 服务端开发 服务端开发 测试连接 Linux - 客户端开发 客户端开发 测试连接 补充 套接字socket 流程图: 网络字 ...

  8. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  9. linux 系统网络服务器组建,配置和管理实训教程 pdf,Linux网络服务器配置管理项目实训教程2...

    Linux网络服务器配置管理项目实训教程2 附录2 Linux常用命令 在文本模式和终端模式下,经常使用Linux命令来查看系统的状态和监视系统的操作,如对文件和目录进行浏览.操作等.在Linux较早 ...

最新文章

  1. 元素水平垂直居中的方法
  2. 【Android 逆向】selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )
  3. 计算机技术是双证,计算机技术在职研究生单证可以转双证吗
  4. 第1章-导言-习题1.13-1.17
  5. Kotlin入门(32)网络接口访问
  6. 论文笔记-LSHTC: A Benchmark for Large-Scale Text Classification-2015
  7. oracle中创建视图的语句,求Oracle创建视图有关语句
  8. Inspect(VB.NET、C#版)软件的的下载和使用
  9. 基于神经网络的指纹识别,指纹比对技术何时出现
  10. 大学生必看:基础IT技术文章300篇大合集!【包含信息/编码、IP/组网、程序逻辑、Web基础等】
  11. 面试题:十瓶牛奶每天至少喝一瓶,直到喝完到底有多少种喝法
  12. 基于K-Means聚类算法对NBA球员数据的聚类分析
  13. 050 XSS通关小游戏——xss challenge
  14. python网页自动填写_Windows下使用python3 + selenium实现网页自动填表功能
  15. C++实现Socket连接通信
  16. 组合数学_排列与组合
  17. 自监督论文阅读笔记DisCo: Remedy Self-supervised Learning on Lightweight Models with Distilled Contrastive
  18. 基于SSM网络蛋糕商城管理系统
  19. Mutiselect下拉复选框(保存和设置默认选中项)
  20. 微软 2020 校园招聘正式启动

热门文章

  1. 用eclipse配置spket编写extjs代码方法
  2. 自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串
  3. JDBC操作数据库就这八步!
  4. OpenDDS通讯中rtps_discovery对等发现的基本配置和说明
  5. 李洋疯狂C语言之有关“you are come from shanghai”逆序(二)
  6. Spring boot 配置tomcat后 控制台不打印SQL日志
  7. “docker-app”实用工具分享,大大提高 Compose 文件复用率
  8. 如何实现线程间的通讯(转载)
  9. SQL Server 视图设计器
  10. 参加第三届信息化创新克拉玛依国际学术论坛