1. 准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在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 < )
  29. {
  30. printf("fcntl(sock, GETFL)");
  31. exit();
  32. }
  33. opts = opts | O_NONBLOCK;
  34. if(fcntl(sock, F_SETFL, opts) < )
  35. {
  36. printf("fcntl(sock, SETFL, opts)");
  37. exit();
  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[]; //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. g_bRun = true;
  78. ret = pipe(fd);
  79. if(ret < )
  80. {
  81. printf("main, pipe fall, %d %s\n", ret, errno);
  82. g_bRun = false;
  83. return ;
  84. }
  85.  
  86. g_ConnInfo.rfd = fd[];
  87. g_ConnInfo.wfd = fd[];
  88.  
  89. setnonblocking(g_ConnInfo.rfd);
  90.  
  91. pthread_attr_t attr;
  92. pthread_attr_init(&attr);
  93. pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
  94.  
  95. ret = pthread_create(&iAcceptThreadId, &attr, AcceptThread, NULL);
  96. if(ret != )
  97. {
  98. printf("main, create accept thread fail: %s\n", errno);
  99. g_bRun = false;
  100. close(g_ConnInfo.rfd); //关闭管道
  101. close(g_ConnInfo.wfd);
  102. return ;
  103. }
  104.  
  105. ret = pthread_create(&iReadThreadId, &attr, ReadThread, NULL);
  106. if(ret != )
  107. {
  108. printf("main, create read thread fail: %s\n", errno);
  109. g_bRun = false;
  110. pthread_join(iAcceptThreadId, NULL);
  111. close(g_ConnInfo.rfd);    
  112. close(g_ConnInfo.wfd);
  113.  
  114. return ;
  115. }
  116.  
  117. while(g_bRun)
  118. {
  119. sleep();
  120. }
  121.  
  122. pthread_join(iAcceptThreadId, NULL); //收回线程的资源,销毁线程
  123. pthread_join(iReadThreadId, NULL);
  124. close(g_ConnInfo.rfd);
  125. close(g_ConnInfo.wfd);
  126.  
  127. return ;
  128. }

Linux网络服务器epoll模型的socket通讯的实现(一)的更多相关文章

  1. Linux 网络 I/O 模型简介(图文)(转载)

    Linux 网络 I/O 模型简介(图文)(转载) 转载:http://blog.csdn.net/anxpp/article/details/51503329 1.介绍 Linux 的内核将所有外部 ...

  2. Java I/O演进与Linux网络I/O模型

    参考文章: 简书-浅谈Linux五种IO:http://www.jianshu.com/p/486b0965c296 一.linux基础概念 1.1 内存空间 linux系统中的使用的是虚拟存储器,即 ...

  3. Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)

    今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...

  4. linux网络编程IO模型

    同步与异步:         同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成.         异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...

  5. LVS (Linux虚拟服务器)模型及算法

    LVS(Linux Virtual Server)Linux虚拟服务器 LVS集群采用IP负载均衡技术和基于内容请求分发技术. 用户请求发给负载均衡调度器,由负载均衡调度器根据设定的调度算法将请求发给 ...

  6. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  7. Linux 网络 I/O 模型简介(图文)

    1.介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个sock ...

  8. Linux 网络I/O模型

    前言 本文是笔者的第一篇博文,在这篇文章的大部分内容基于steven大神的<Unix Network Programming>.一来是对书本内容的整理与归纳.二来也是为接下来的博文奠定基础 ...

  9. 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景

    相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...

随机推荐

  1. C++ 过载,重写,隐藏

    1.过载:在一个类中(也就是一个作用域),方法名相同,形参表不同的方法. 2.重写:父类方法使用virtual,子类方法和方法的方法名,形参表,返回类型相同,子类可以不使用virtual,但是建议使用 ...

  2. Rank of Tetris(hdu1811拓扑排序+并查集)

    题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...

  3. MmSystem播放Wav格式声音

    //MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...

  4. [AngularJS] Transclude -- using what existing in DOM to replace the template elements in directive

    var app = angular.module("phoneApp", []); app.controller("AppCtrl", function($sc ...

  5. iOS开发——UI篇OC篇&不规则排列的图片布局

    不规则排列的图片布局 一直在500px上看照片,发照片.以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下.昨天不知怎么的就开始想其中的算法了,现在我把思考的过程在这里贴出来分 ...

  6. 多台Linux服务器SSH相互访问无需密码--转

    一.环境配置 1.系统:CentOS release 5.6   IP:192.168.4.200   主机名:JW01 2.系统:CentOS release 5.9   IP:192.168.4. ...

  7. win7如何共享文件 图文教你设置win7文件共享

    点评:win7文件共享已成为网友们之间的热议,接下来为大家分享下如何共享文件,首先开启guest账户( 开始菜单 → 运行 → services.msc → 双击 server 服务项 ,设置启动类型 ...

  8. ExtJs 下拉菜单分页工具插件 代码分析

    Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...

  9. Android(java)学习笔记154:使用GridView以及重写BaseAdapter

    1.BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方 ...

  10. Android打包程序

    右击项目->导出export next,完成相关信息填写将得到.apk文件,即可部署到手机上. 第一次: 然后打开目录就可以看到生成的apk,可以发布到各大市场上.