我有一个单线程程序。它每五秒向四个目的地发送消息。我不想要connect()
被阻止。所以,我写我的程序是这样的:选择多个非阻塞连接
int j, rc, non_blocking=1, sockets[4], max_fd=0;
struct sockaddr server=get_server_addr();
fd_set fdset;
const struct timeval conn_timeout = { 2, 0 }; /* 2 seconds */
for (j=0; j<4; ++j)
{
sockets[j]=socket(AF_INET, SOCK_STREAM, 0);
ioctl(sockets[j], FIONBIO, (char *)&non_blocking);
connect(sockets[j], &server, sizeof (server));
}
/* prepare fd_set */
FD_ZERO (&fdset);
for (j=0;j<4;++j)
{
if (sockets[j] != -1)
{
FD_SET (sockets[j], &fdset);
if (sockets[j] > max_fd)
{
max_fd = sockets[j];
}
}
}
rc=select(max_fd + 1, NULL, &fdset, NULL, &conn_timeout);
if(rc > 0)
{
for (j=0;j<4;++j)
{
if(sockets[j]!=-1 && FD_ISSET(sockets[j],&fdset))
{
/* send() */
}
}
}
/* close all valid sockets */
然而,似乎select()
返回之后立即ONE文件描述符准备就绪,而不是阻断conn_timeout
(2秒)。那么在这种情况下,我该如何实现目标?
- 如果所有套接字都准备好了,程序会继续。
- 如果任何一个套接字没有准备好,程序可以在那里阻塞2秒。
您的编辑后,你的目标是不完整的。如果只有一些套接字准备就绪,程序应该做什么? – EJP 2013-04-28 00:25:38
对不起,我没有说清楚我的观点。如果只有一些套接字准备就绪,程序应该等待2秒钟并丢弃那些未准备好的套接字。 – Edmund 2013-04-28 00:30:59
那么这就是发生了什么,而选择()正在做你所需要的。那么你的问题是什么? – EJP 2013-04-28 00:46:43