我想请教LINUX 下socket 超时设置的问题

socket通信分服务端和客户端,我对其超时设置是这样理解的,在客户端里面,我可以先设置超时设置,然后调用connect函数链接服务端,这个函数会在前面超时设置的时间内不... socket通信分服务端和客户端,我对其超时设置是这样理解的,在客户端里面,我可以先设置超时设置,然后调用connect函数链接服务端,这个函数会在前面超时设置的时间内不停的connect服务端,如果超出时间限制则返回错误信息!是这样理解的吗?如果理解对的话那么在服务端怎么设置超时呢!服务端的流程是:也是想设置超时,然后调用bind 然后调用listen函数,这里那个部分用到了超时设置呢!什么地方超时返回呢!!因为刚刚涉及到socket编程,入行未深!希望各位可以帮忙!
1 可能大部分人用的都是用select来设置超时!能不能就用这个给我讲解一下啊!
2 其实我调用的socket函数是一个apr库里面的,超时设置是apr_socket_timeout_set函数,应该和正常情况下有个函数是对应起来的,只是我还不知道!如果有人知道的就更好了
展开
 我来答
coolxp2005
2009-02-17 · TA获得超过823个赞
知道小有建树答主
回答量:202
采纳率:0%
帮助的人:165万
展开全部
举例:

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中。
againyuan
2009-02-17
知道答主
回答量:33
采纳率:0%
帮助的人:13.3万
展开全部
有个例子,你看一下
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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式