我想请教LINUX 下socket 超时设置的问题
socket通信分服务端和客户端,我对其超时设置是这样理解的,在客户端里面,我可以先设置超时设置,然后调用connect函数链接服务端,这个函数会在前面超时设置的时间内不...
socket通信分服务端和客户端,我对其超时设置是这样理解的,在客户端里面,我可以先设置超时设置,然后调用connect函数链接服务端,这个函数会在前面超时设置的时间内不停的connect服务端,如果超出时间限制则返回错误信息!是这样理解的吗?如果理解对的话那么在服务端怎么设置超时呢!服务端的流程是:也是想设置超时,然后调用bind 然后调用listen函数,这里那个部分用到了超时设置呢!什么地方超时返回呢!!因为刚刚涉及到socket编程,入行未深!希望各位可以帮忙!
1 可能大部分人用的都是用select来设置超时!能不能就用这个给我讲解一下啊!
2 其实我调用的socket函数是一个apr库里面的,超时设置是apr_socket_timeout_set函数,应该和正常情况下有个函数是对应起来的,只是我还不知道!如果有人知道的就更好了 展开
1 可能大部分人用的都是用select来设置超时!能不能就用这个给我讲解一下啊!
2 其实我调用的socket函数是一个apr库里面的,超时设置是apr_socket_timeout_set函数,应该和正常情况下有个函数是对应起来的,只是我还不知道!如果有人知道的就更好了 展开
2个回答
展开全部
举例:
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中。
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中。
展开全部
有个例子,你看一下
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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询