1 设置网络socket非阻塞:
1 | u_long has = 1; |
这个函数很有可能返回success,却并没有设置成功。
windows对此有优化,对于linux版本应采用fcntl设置。
总结如下:
1 | int |
2 windows环境下查看错误
1 | 使用WSAGetLastError函数需要配置 |
3 EPOLLET这个宏是最小int
EPOLLET这个宏的数值为-2147483648, 是能表示的最小int值。
4 make: 警告:检测到时钟错误。您的创建可能是不完整的。
可以通过ls -l查看具体的是哪个文件的时间错了,就可以对症下药了,直接 “ touch 对应文件 “ 就可以解决这个问题。
或者读者可以用 “ touch * “ 来更新整个项目文件的时间,这也可以解决问题。
5 select fd_set 对于不同平台实现是不同的
在windows平台实现
1 | typedef struct fd_set { |
很明了,一个计数的fd_count,另一个就是SOCKET数组。其中,FD_SETSIZE是可以设置的。整个fd_set的过程实际上就是将对应的
fd_count作为数组下标,数组元素存储的是对应socket fd。比如说当前读事件集合readset的fd_count 为7,当要监控socket fd为5 的读事件到来时,那么readset这个集合中下标为8的数组元素为5,fd_count = 8以此类推。当调用select时,会返回对应读,写集合所有的描述符数组,并且重置内部的fd_count数量,然后分别调用读写函数即可。
下面是fd_set在linux下的实现:
1 | typedef struct |
根据UNIX网络编程对fd_set的介绍,fd_set是个整数数组,用每个bit位来表示fd的。比如,一个32位整数,则数组第一个整数表示0-31的fd,以此类推,第二个整数表示32-63
查看linux的FD_SET、FD_CLR是用汇编实现的。根据说明可以知道,就是给bit置位。
fd_set在不同平台实现的机制不一样,select第一个参数在linux环境下表示最大描述符数+1。windows无意义。
下面是我根据libevent早期版本实现的一套select模型:
1 |
|