时间:2017-4-18来源:本站原创作者:佚名

1设置网络socket非阻塞:

u_longhas=1;ioctl(m_sock,FIONBIO,has);

这个函数很有可能返回success,却并没有设置成功。windows对此有优化,对于linux版本应采用fcntl设置。

总结如下:

2windows环境下查看错误

使用WSAGetLastError函数需要配置lib,"ws2_32.lib"

3EPOLLET这个宏是最小int

EPOLLET这个宏的数值为-,是能表示的最小int值。

4

make:警告:检测到时钟错误。您的创建可能是不完整的。

可以通过ls-l查看具体的是哪个文件的时间错了,就可以对症下药了,直接"touch对应文件"就可以解决这个问题。

或者读者可以用"touch*"来更新整个项目文件的时间,这也可以解决问题。

5selectfd_set对于不同平台实现是不同的

在windows平台实现typedefstructfd_set{u_intfd_count;/*howmanyareSET?*/SOCKETfd_array[FD_SETSIZE];/*anarrayofSOCKETs*/}fd_set;很明了,一个计数的fd_count,另一个就是SOCKET数组。其中,FD_SETSIZE是可以设置的。整个fd_set的过程实际上就是将对应的fd_count作为数组下标,数组元素存储的是对应socketfd。

比如说当前读事件集合readset的fd_count为7,当要监控socketfd为5的读事件到来时,

那么readset这个集合中下标为8的数组元素为5,fd_count=8以此类推。

当调用select时,会返回对应读,写集合所有的描述符数组,并且重置内部的fd_count数量,

然后分别调用读写函数即可。

下面是fd_set在linux下的实现:typedefstruct{/*XPG4.2requiresthismembername.Otherwiseavoidthenamefromtheglobalnamespace.*/#ifdef__USE_XOPEN__fd_maskfds_bits[__FD_SETSIZE/__NFDBITS];#define__FDS_BITS(set)((set)-fds_bits)#else__fd_mask__fds_bits[__FD_SETSIZE/__NFDBITS];#define__FDS_BITS(set)((set)-__fds_bits)#endif}fd_set;

根据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模型:

到此总结完毕,







































哪里能治愈白癜风
北京都有哪些白癜风医院

转载请注明原文网址:http://www.gzdatangtv.com/bcyyys/6535.html

------分隔线----------------------------