最后更新于 .

connect中使用了select模型,有如下地方需要注意:
我们提供的server api中有很多地方用到了select,特别是在等超时的时候,
例如:
fd_set recv_fds;
int iNum= 0;
if (m_iSocket <0) return -1;
FD_ZERO( &recv_fds );
FD_SET( m_iSocket, &recv_fds );
iNum= select( m_iSocket+1, &recv_fds, NULL, NULL, timeout );
return iNum;
这段代码对于cgi,或者简单的逻辑server不会有问题。但是对于多线程或者复杂的server可能会导致server core掉。
原因是select默认只支持1024个句柄,每个句柄采用和1024个bit对应的关系,如果fd的值超过1024,那么就会溢出。
也就是说,如果上面代码的m_iSocket>1024,那么后面的select就会溢出,即使只监听一个句柄也会溢出。奇怪的是select也不会报错。
而对于多线程或者大连接的server很有可能分配的fd超过1024.
所以建议以后写的api尽量有poll或者epoll的方式。
有poll改写了下面的代码:
int waittime = (timeout->tv_sec*1000)+(timeout->tv_usec/1000.0);
struct pollfd  client;
client.fd = m_iSocket;
client.events = POLLIN;
return poll(&client, 1, waittime);

connect中使用了select模型,有如下地方需要注意: 我们提供的server api中有很多地方用到了select,特别是在等超时的时候, 例如:

fd_set recv_fds;
int iNum= 0;
if (m_iSocket <0) return -1;
FD_ZERO( &recv_fds );
FD_SET( m_iSocket, &recv_fds );
iNum= select( m_iSocket+1, &recv_fds, NULL, NULL, timeout );
return iNum;

这段代码对于cgi,或者简单的逻辑server不会有问题。但是对于多线程或者复杂的server可能会导致server core掉。 原因是select默认只支持1024个句柄,每个句柄采用和1024个bit对应的关系,如果fd的值超过1024,那么就会溢出。 也就是说,如果上面代码的m_iSocket>1024,那么后面的select就会溢出,即使只监听一个句柄也会溢出。奇怪的是select也不会报错。 而对于多线程或者大连接的server很有可能分配的fd超过1024. 所以建议以后写的api尽量有poll或者epoll的方式。 有poll改写了下面的代码:

int waittime = (timeout->tv_sec*1000)+(timeout->tv_usec/1000.0);
struct pollfd  client;
client.fd = m_iSocket;
client.events = POLLIN;
return poll(&client, 1, waittime);

 

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

暂无评论

发表评论