看下面代码是否有问题:
struct timeval time;
time.tv_sec = 0;
time.tv_usec = 1000;
for(;;)
{
if(g_bServerStart == false)
goto cleanup;
retval = select(0, &readfds, NULL, NULL, &time);
//retval = select(0, &readfds, NULL, NULL, NULL);
if (retval == SOCKET_ERROR)
{
fprintf(stderr, "ob select failed %d\n", WSAGetLastError());
goto cleanup;
}
if(retval == 0)
continue;
}
select会出现超时后错误,原因为select后,超时,会清除FDSET即没有响应的描述符,导致readfds失效。正确的写法为
struct timeval time;
time.tv_sec = 0;
time.tv_usec = 1000;
for(;;)
{
if(g_bServerStart == false)
goto cleanup;
//
// The fd sets should be zeroed out before using them to prevent errors.
FD_ZERO(&readfds);
// Set the server sockets
FD_SET(g_ob_server_socket, &readfds);
retval = select(0, &readfds, NULL, NULL, &time);
//retval = select(0, &readfds, NULL, NULL, NULL);
if (retval == SOCKET_ERROR)
{
fprintf(stderr, "ob select failed %d\n", WSAGetLastError());
goto cleanup;
}
if(retval == 0)
continue;