linux 网络编程 3---(io多路复用,tcp并发)
1,io模型:
阻塞io、非阻塞io、io多路复用,信号驱动io。
阻塞Io与非阻塞io的转换,可用fcntl()函数
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd,int cmd,...);
2,io多路复用
在应用程序中同时处理多路输入输出流
若采用阻塞模式,将得不到预期的目的
若采用非阻塞模式,对多个输入进行轮询,则浪费CPU资源
若设置多个进程,分别处理一条数据通路,将新产生进程间的同步与通信问题
使得程序变得过于复杂。
这时,比较好的方法是使用IO多路复用,其基本思想是:
先构造一张有关描述符的表,然后调用一个函数。
当这些文件描述符中的一个或多个已准备好进行IO函数时,函数才返回
函数返回时,高诉进程哪个描述符已经就绪,可以进行IO操作。
使用IO多路复用时,主要用到以下函数(LINUX)
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set * exceptfds,struct timeval * timeout);
void FD_ZERO(fd_set *set);
void FD_SET(int fd,fd_set *set);
void FD_CLR(int fd,fd_set *set);
int FD_ISSET(int fd,fd_set *set);
莫做伸手党。
3,实现TCP并发服务器
方法一:通过使用父子进程实现tcp并发服务器
方法二:使用select函数实现tcp并发服务器
法一:
socket();
sockaddr_in;
bind();
listen();
while(1)
{
accept();
pid = fork();
if(pid > 0){}父进程负责连接
else if(pid == 0){
while(1)
{
recv()/send();
}
}
}
这里有个难点:一个客户端退出后,如何避免对应的“服务器”进程,编程僵尸进程?
解决办法是:采用信号,来回收客户端对应“服务器的资源”。
法二:笔者也在琢磨。。。。。。
linux 网络编程 3---(io多路复用,tcp并发)的更多相关文章
- Linux 网络编程(IO模型)
		
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
 - Python网络编程:IO多路复用
		
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...
 - UNIX/Linux网络编程基础:图解TCP/IP协议栈
		
目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...
 - linux网络编程学习笔记之三 -----多进程并发服务端
		
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
 - Linux网络编程之聊天程序(TCP协议之select)
		
服务器端:server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include & ...
 - Linux 网络编程详解七(并发僵尸进程处理)
		
在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导 ...
 - linux网络编程基础--(转自网络)
		
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
 - Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
		
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
 - Linux网络编程——tcp并发服务器(poll实现)
		
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
 - Linux 网络编程的5种IO模型:信号驱动IO模型
		
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
 
随机推荐
- asp.net c# 断点续传 下载 Accept-Ranges
			
转自:http://www.cnblogs.com/90nice/p/3489287.html 1.因为要下载大文件 需要断点续传,使用多线程 分段下载 效率比较高,节省资源. 发点牢骚:下载可以用多 ...
 - SAP云平台对Kubernetes的支持
			
截至本文发稿(2019-2-10, 农历大年初六)时为止,访问SAP云平台的官方网站:https://cloudplatform.sap.com/enterprise-paas/kubernetes. ...
 - Cloud Tool 小探索
			
Google Apps不用多说. Google drive免费提供15GB的容量. Microsoft Windows Live感觉功能上和google相比无亮点和优势. SkyDrive免费提供7G ...
 - [转]删除MSSQL所有的约束及表格
			
--删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...
 - JavaScript小游戏--2048(移动端)
			
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
 - Entity Framework——读写分离
			
1 实现 CustomDbContext扩展了DbContext,其构造函数带有形式参nameOrConnectionString,可以在使用CustomDbContext时指定数据库连接字符串. D ...
 - Hibernate之CRUD实践
			
Hibernate作为一个高度封装的持久层框架,曾经是非常牛逼的,现在虽然应用不是特别广,比如我前公司主要是做OA的,应用的框架就是Spring+SpringMVC+Hibernate. Hibern ...
 - stack的三个意思
			
(转自阮一峰的网络日志,原网址http://www.ruanyifeng.com/blog/2013/11/stack.html) 阮一峰老师终于又更新博客了,个人认为这篇文章有一定科普意义,有一定解 ...
 - 【题解】洛谷P1311 [NOIP2011TG] 选择客栈(递推)
			
题目来源:洛谷P1311 思路 纯暴力明显过不了这道题 所以我们要考虑如何优化到至多只能到nlogn 但是我们发现可以更优到O(n) 我们假设我们当前寻找的是第二个人住的客栈i 那么第一个人住的客栈肯 ...
 - 【题解】POJ 3417 Network(倍增求LCA+DP+树上差分)
			
POJ3417:http://poj.org/problem?id=3417 思路 我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环 ...