当前位置:  技术问答>linux和unix

sock编程中I/O复用机制

    来源: 互联网  发布时间:2016-07-06

    本文导语:  最近在编写一些sock程序,客户端和服务端要用到I/O复用机制,但对这个I/O复用不是很明白。 我真心请教各位。特别是这个复用,不是很懂 | 不要从字面上去理解复用, multiplexing的直接翻译意...

最近在编写一些sock程序,客户端和服务端要用到I/O复用机制,但对这个I/O复用不是很明白。
我真心请教各位。特别是这个复用,不是很懂

|
不要从字面上去理解复用,
multiplexing的直接翻译意为多路技术。

为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。

select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。

|
select会循环遍历它所监测的fd_set(一组文件描述符(fd)的集合)内的所有文件描述符对应的驱动程序的poll函数。驱动程序提供的poll函数首先会将调用select的用户进程插入到该设备驱动对应资源的等待队列(如读/写等待队列),然后返回一个bitmask告诉select当前资源哪些可用。当select循环遍历完所有fd_set内指定的文件描述符对应的poll函数后,如果没有一个资源可用(即没有一个文件可供操作),则select让该进程睡眠,一直等到有资源可用为止,进程被唤醒(或者timeout)继续往下执行。


select会遍历所有的fd,但是我不是指它是死循环。遍历是为了给每个fd的poll作排队。
我说的不停扫描是对epoll比较的,select需要扫描所有的fd的poll一遍,而epoll是不需要的。

|
这个楼主还必须注意一点就是防止sokect通讯失败,因为你频繁创建的时候都是针对一个端口的操作,当上一次的通讯句柄还没有被完全关闭的时候就来下一个sokect通讯,这样会造成有些通讯的失败,所以每次通讯要确保关闭通讯句柄,这样就会保证通讯的质量

|
复用最基本的就是select.
道理就是你socket建立多个连接,自然就有多个fd,select会不停扫描每个fd,发现有可读或者可写,就会进入相应的代码段。
跟switch差不多啦。

自己找个例子来照着用不就知道了。

更优秀的有epoll,不过比select复杂些。

|
如果你是大四的学生,建议你还是打好基础再说,你问的那个已经属于比较高级的技术了,把数据结构和c的基础打好比什么都强。因为你还要考6级嘛。

|
那个REUSED 我看到的主要作用是这样的,比如你开了一个socket,并占用了某个端口。但你关闭连接的时候,那个端口不会马上空闲出来,可能哪个端口号要过一段时间才能够被新的socket来用。如果你setopt设置了端口复用REUSED,那么只要本次连接断开,端口就会马上空闲出来,而不需要等待多长时间才能用。

|
不用阻塞资源的那种模式

|


支持此说法!

|
好比一家10个人就一俩自行车,平时自行车就在那放着,家里有谁要用了,自行车就给谁用

|
学习,帮顶!

|
学习中、、、

|
有点难呀  帮楼主顶下 等牛人给你解答

|
过程大概差不多,linux下是把进程挂在设备对应的等待队列上的。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sock编程高手救救小弟!
  • 网络技术 iis7站长之家
  • 看Unix环境高级编程,提到了V和bsd,有很多不同,但是没有提到Linux,请问linux跟BSD或者unix V 编程细节哪些不同的,特别是线程,进程,和socke
  • sock编程遇到的一个小小的疑问,麻烦前辈指教!
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • LINUX-SOCK编程基础问题?望斑竹解答1
  • sock编程出错,求助!
  • 关于socked编程,高分相送,在线等!
  • java命名空间java.net枚举proxy.type的类成员方法: socks定义及介绍
  • SOCKS服务器 Socks Server 5
  • 跨平台的socks服务器 socks_server
  • sock_raw和sock_packet的问题
  • 帮忙看一下应该服务端建sockfd用SOCK_DGRAM还是SOCK_STREAM??
  • 套接字中,第二个参数SOCK_RAW 与SOCK_PACKET 有什么区别
  • err=sock->ops->setsockopt(sock, SOL_SOCKET, ...);返回值代表的含义?
  • 代理服务器 Socks5
  • 【求助】我刚装REDHAT9,用SOCK函数总返回-1
  • 如何通过http代理实现socks代理?
  • Linux下socks5如何设置?
  • 关于socks5的问题,总是死...why?
  • 多个sock同时监听一个port
  • 调用sock_create,为什么会返回-13?
  • 谁有Socks服务器的压缩包,送我一个吧
  • 关于linux下面的sock5到http的转换工具!
  • Socks代理上网工具 tsocks
  • 那里有socks5-v1.0r11.tar.gz下载?
  • SOCKS代理服务器 Dante
  • 代理服务器 node-socks
  • 父进程发包,fork子进程收回传的包,sock_filter后,子进程收不到包


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3