2 回答

TA贡献2051条经验 获得超10个赞
有个例子,你看一下
int select_socket_process(int sock_fd)
{
struct timeval tv;
fd_set readfds;
int select_rtn;
while(1)
{
tv.tv_sec = 0;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(sock_fd, &readfds);
select_rtn = select(sock_fd+1, &readfds, NULL, NULL, &tv);
if (select_rtn == -1)
{
printf("select err£¡ %s", strerror(errno));
continue;
} else if (select_rtn == 0)
{
//printf ("no message,time out...\n");
//continue;
snmp_status_alarm_polling(sysconfig);
}
else
{
if (FD_ISSET(sock_fd, &readfds))
{
//printf("A key was pressed!\n");
snmp_recv_send_process(sock_fd, pktbuf);
}
else
{
printf("FD_ISSET ERR.\n");
}
}
}
return 0;
}

TA贡献1853条经验 获得超6个赞
举例:
s=socket();
设置s为non-blocking;
connect(s,..);
FD_SET...;
rc = select(..., 10s);
if (rc == 0) 表示10s超时了。
这个超时的意思是:10s之内,select中所有socket的事件均未产生(如果至少有一个产生,则rc大于0)
注意:这个10s跟connect本身的超时机制完全无关,前者的设置不影响后者。10s后select的返回,表明10s内connect还没成功,connect可能还在按自己的超时机制(例如慢启动)尝试重连(当然它最终也有个超时)。
至于connect本身的超时是否可以设置,可能各系统不一样。
顺便提醒:connect的socket必须是non-blocking类型,否则,connect会阻塞,也就没必要用select来检测是否连接成功。另外,那个s要注册到write类型的fd中,即select的第3个参数中。
其他listen,recv什么的,完全类似(但listen,recv本身没有什么超时概念)。只不过listen的和recv的socket,要注册到read的fd中。
添加回答
举报