我有一个单线程程序。它每五秒向四个目的地发送消息。我不想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 秒。