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 }
转载于:https://www.cnblogs.com/jiangwang2013/p/3581526.html
Linux网络服务器epoll模型的socket通讯的实现(一)相关推荐
- linux线程同步 epoll,Linux网络编程--epoll 模型原理详解以及实例
1.简介 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux 2.6内核中有提高网络I/O性能的新方法,即epoll . epoll是什么?按 ...
- Netty入门笔记-Linux网络I/O模型介绍
在之前的博客中并没有将关于Netty的知识系统的总结起来.从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家 ...
- java IO初识与Linux网络I/O模型简介
Java的 I/O发展简史 从 JDK1.0到 JDK1.3, Java的 I/O类库都非常原始,很多 UNIX网络编程中的概念或接口在l/O类库中都没有体现,例如 Pipe. Channel. Bu ...
- 高性能服务器设计——常用网络服务器设计模型(转载)
文章来源:http://blog.csdn.net/jiang1013nan/article/details/17471341 在业务服务开发过程中,一个优秀的开发框架,往往能够起到事半功倍的效果.现 ...
- linux网络编程(二)TCP通讯状态
linux网络编程(二)TCP通讯状态 TCP状态转换 为什么需要等待2MSL? 端口复用 TCP状态转换 tcp协议连接开始会经过三次握手,客户端和服务器开始都会处于CLOSED状态 第一次握手:客 ...
- LinuxI/O多路复用转接服务器——epoll模型实现
LinuxI/O多路复用转接服务器--epoll模型实现 epoll函数 epoll函数组 epoll_create函数 epoll_ctl函数 epoll_wait函数 epoll实现实现I/O多路 ...
- Linux - 网络服务器开发(全)
文章目录 Linux - 网络服务器开发(Ubuntu) Linux - 服务端开发 服务端开发 测试连接 Linux - 客户端开发 客户端开发 测试连接 补充 套接字socket 流程图: 网络字 ...
- linux网络编程二:基础socket, bind, listen, accept, connect
linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h> #inc ...
- linux 系统网络服务器组建,配置和管理实训教程 pdf,Linux网络服务器配置管理项目实训教程2...
Linux网络服务器配置管理项目实训教程2 附录2 Linux常用命令 在文本模式和终端模式下,经常使用Linux命令来查看系统的状态和监视系统的操作,如对文件和目录进行浏览.操作等.在Linux较早 ...
最新文章
- 元素水平垂直居中的方法
- 【Android 逆向】selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )
- 计算机技术是双证,计算机技术在职研究生单证可以转双证吗
- 第1章-导言-习题1.13-1.17
- Kotlin入门(32)网络接口访问
- 论文笔记-LSHTC: A Benchmark for Large-Scale Text Classification-2015
- oracle中创建视图的语句,求Oracle创建视图有关语句
- Inspect(VB.NET、C#版)软件的的下载和使用
- 基于神经网络的指纹识别,指纹比对技术何时出现
- 大学生必看:基础IT技术文章300篇大合集!【包含信息/编码、IP/组网、程序逻辑、Web基础等】
- 面试题:十瓶牛奶每天至少喝一瓶,直到喝完到底有多少种喝法
- 基于K-Means聚类算法对NBA球员数据的聚类分析
- 050 XSS通关小游戏——xss challenge
- python网页自动填写_Windows下使用python3 + selenium实现网页自动填表功能
- C++实现Socket连接通信
- 组合数学_排列与组合
- 自监督论文阅读笔记DisCo: Remedy Self-supervised Learning on Lightweight Models with Distilled Contrastive
- 基于SSM网络蛋糕商城管理系统
- Mutiselect下拉复选框(保存和设置默认选中项)
- 微软 2020 校园招聘正式启动
热门文章
- 用eclipse配置spket编写extjs代码方法
- 自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串
- JDBC操作数据库就这八步!
- OpenDDS通讯中rtps_discovery对等发现的基本配置和说明
- 李洋疯狂C语言之有关“you are come from shanghai”逆序(二)
- Spring boot 配置tomcat后 控制台不打印SQL日志
- “docker-app”实用工具分享,大大提高 Compose 文件复用率
- 如何实现线程间的通讯(转载)
- SQL Server 视图设计器
- 参加第三届信息化创新克拉玛依国际学术论坛