我在Linux上有一个非阻塞的连接套接字,在我的第一个send()之前,我选择查看套接字是否已准备好写入,但是选择超时。
如果我不做选择,发送工作正常。
如果我先选择,我永远不会发送任何东西。
当套接字明显可写时,为什么在发送之前选择超时?
这是我正在使用的一些代码:
fd_set writefds; struct timeval timeout;// FD_ZERO(&writefds); FD_SET(s, &writefds);//s is my connected socket
timeout.tv_sec = 10;
timeout.tv_usec = 0;
ret = select(1, 0, &writefds, 0, &timeout);
switch(ret)
{
case 1://socket is ready for writing
bytesSent = send(s, (const char*)(buf+bytesSent), len-bytesSent, 0);
if(SOCKET_ERROR == bytesSent)
{
*error = errno;
if(EWOULDBLOCK == *error)
{
goto Exit;
}
sprintf(errmsg, ("send() failed %i\n"), *error);
}
else if(bytesSent < len)
{
sprintf(errmsg, ("send() incomplete\n"));
}
else
{
//sprintf(errmsg, ("sent %i bytes\n"), bytesSent);
}
break;
case 0://timeout --!!!! always comes here
bytesSent = -1;//treat as error
break;
default:
bytesSent = -1;
}
}
块引用
答案 0 :(得分:0)
在从Windows select()
到UNIX/Berkeley-derived select()
的端口中,您将您提供的虚拟值保留为select()
的第一个参数。
在UNIX上,当然,此参数( nfds )是有意义的,必须大于集合中的最高fd。因此,对你来说它应该是s + 1
。