Linux网络服务器epoll模型的socket通讯的实现(一)
- 准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码:
1 #include <stdio.h>- #include <sys/types.h>
- #include <sys/epoll.h>
- #include <sys/socket.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <map>
- #include <errno.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <unistd.h>
- using namespace std;
- struct conninfo{
- int rfd;
- int wfd;
- //map<struct ipport, struct perrinfo> peer;
- };
- bool g_bRun;
- struct conninfo g_ConnInfo;
- void setnonblocking(int sock)
- {
- int opts;
- opts = fcntl(sock, F_GETFL);
- if(opts < )
- {
- printf("fcntl(sock, GETFL)");
- exit();
- }
- opts = opts | O_NONBLOCK;
- if(fcntl(sock, F_SETFL, opts) < )
- {
- printf("fcntl(sock, SETFL, opts)");
- exit();
- }
- return ;
- }
- static void sig_pro(int signum)
- {
- printf("sig_pro recv signal: %d\n", signum);
- if(signum == SIGQUIT)
- {
- g_bRun = false;
- }
- }
- void* AcceptThread(void* arg)
- {
- printf("accpet thread\n");
- return NULL;
- }
- void* ReadThread(void* arg)
- {
- printf("read thread\n");
- return NULL;
- }
- int main()
- {
- int ret;
- int fd[]; //pipe
- pthread_t iAcceptThreadId;
- pthread_t iReadThreadId;
- struct sigaction sa;
- sa.sa_flags = SA_RESTART;
- sa.sa_handler = sig_pro;
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGUSR1, &sa, NULL);
- sigaction(SIGUSR2, &sa, NULL);
- g_bRun = true;
- ret = pipe(fd);
- if(ret < )
- {
- printf("main, pipe fall, %d %s\n", ret, errno);
- g_bRun = false;
- return ;
- }
- g_ConnInfo.rfd = fd[];
- g_ConnInfo.wfd = fd[];
- setnonblocking(g_ConnInfo.rfd);
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
- ret = pthread_create(&iAcceptThreadId, &attr, AcceptThread, NULL);
- if(ret != )
- {
- printf("main, create accept thread fail: %s\n", errno);
- g_bRun = false;
- close(g_ConnInfo.rfd); //关闭管道
- close(g_ConnInfo.wfd);
- return ;
- }
- ret = pthread_create(&iReadThreadId, &attr, ReadThread, NULL);
- if(ret != )
- {
- printf("main, create read thread fail: %s\n", errno);
- g_bRun = false;
- pthread_join(iAcceptThreadId, NULL);
- close(g_ConnInfo.rfd);
- close(g_ConnInfo.wfd);
- return ;
- }
- while(g_bRun)
- {
- sleep();
- }
- pthread_join(iAcceptThreadId, NULL); //收回线程的资源,销毁线程
- pthread_join(iReadThreadId, NULL);
- close(g_ConnInfo.rfd);
- close(g_ConnInfo.wfd);
- return ;
- }
Linux网络服务器epoll模型的socket通讯的实现(一)的更多相关文章
- Linux 网络 I/O 模型简介(图文)(转载)
Linux 网络 I/O 模型简介(图文)(转载) 转载:http://blog.csdn.net/anxpp/article/details/51503329 1.介绍 Linux 的内核将所有外部 ...
- Java I/O演进与Linux网络I/O模型
参考文章: 简书-浅谈Linux五种IO:http://www.jianshu.com/p/486b0965c296 一.linux基础概念 1.1 内存空间 linux系统中的使用的是虚拟存储器,即 ...
- Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)
今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...
- linux网络编程IO模型
同步与异步: 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...
- LVS (Linux虚拟服务器)模型及算法
LVS(Linux Virtual Server)Linux虚拟服务器 LVS集群采用IP负载均衡技术和基于内容请求分发技术. 用户请求发给负载均衡调度器,由负载均衡调度器根据设定的调度算法将请求发给 ...
- --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能
PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...
- Linux 网络 I/O 模型简介(图文)
1.介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个sock ...
- Linux 网络I/O模型
前言 本文是笔者的第一篇博文,在这篇文章的大部分内容基于steven大神的<Unix Network Programming>.一来是对书本内容的整理与归纳.二来也是为接下来的博文奠定基础 ...
- 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景
相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...
随机推荐
- C++ 过载,重写,隐藏
1.过载:在一个类中(也就是一个作用域),方法名相同,形参表不同的方法. 2.重写:父类方法使用virtual,子类方法和方法的方法名,形参表,返回类型相同,子类可以不使用virtual,但是建议使用 ...
- Rank of Tetris(hdu1811拓扑排序+并查集)
题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...
- MmSystem播放Wav格式声音
//MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...
- [AngularJS] Transclude -- using what existing in DOM to replace the template elements in directive
var app = angular.module("phoneApp", []); app.controller("AppCtrl", function($sc ...
- iOS开发——UI篇OC篇&不规则排列的图片布局
不规则排列的图片布局 一直在500px上看照片,发照片.以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下.昨天不知怎么的就开始想其中的算法了,现在我把思考的过程在这里贴出来分 ...
- 多台Linux服务器SSH相互访问无需密码--转
一.环境配置 1.系统:CentOS release 5.6 IP:192.168.4.200 主机名:JW01 2.系统:CentOS release 5.9 IP:192.168.4. ...
- win7如何共享文件 图文教你设置win7文件共享
点评:win7文件共享已成为网友们之间的热议,接下来为大家分享下如何共享文件,首先开启guest账户( 开始菜单 → 运行 → services.msc → 双击 server 服务项 ,设置启动类型 ...
- ExtJs 下拉菜单分页工具插件 代码分析
Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...
- Android(java)学习笔记154:使用GridView以及重写BaseAdapter
1.BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方 ...
- Android打包程序
右击项目->导出export next,完成相关信息填写将得到.apk文件,即可部署到手机上. 第一次: 然后打开目录就可以看到生成的apk,可以发布到各大市场上.