非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?
在通常的 *nix 的操作系统中,文件的 fd 分配的时候总是取最小的没有被分配的值,用于 select 的 fd_set 被实现为了一个位图,select 也就需要一个参数来表明需要查询的 fd 的范围。(见pselect)
而在Windows中,套接字的句柄不一定是连续分配的(实际上是 HANDLE),于是 fd_set 也就只好被实现为了一个表示数组长度的值 + 一个存句柄的数组,select 的第一个参数也就没什么用,直接被忽略掉了,仅仅是为了兼容而存在。(见select function (Windows))
【非阻塞socket时用的 select函数的第一个参数,为啥经常是sockID+1?】
(稍微有点乱,凑合着看……)
■网友
你就不能先man 一下select吗?
■网友
因为Select的第一个参数是所监听的最大描述符数,而描述符都是从0(标准输入)开始的,所以要在Open_listenfd(port) 所获取的监听描述符基础上加1。可参考CSAPP第12章网络并发编程-基于多路IO复用的并发编程。
■网友
你也可以+2啊,只要你的文件描述符号小于这个范围,缩小范围。
推荐阅读
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 咋自己发布网站
- 为啥房多多没像滴滴一样火?
- 趣头条|实用的代步工具,第三代哈弗H6!
- 补水|安全又补水,妈妈们都抢着用!这款给孩子用的高性价比面霜
- ibeacon目前在国内有已经应用或者商用的产品案例吗
- 《亿万》第九集里,法官用的这个搜索引擎是啥
- 新车|靠谱省油又耐用的品牌将推新款SUV,双色车身很帅气
- 怎样看待微软校招笔试使用的评测系统并不使用自家的产品
- 怎样统计工程中未使用的java类
