为了账号安全,请及时绑定邮箱和手机立即绑定

因为刚刚涉及到socket编程,入行未深!希望各位可以帮忙!

因为刚刚涉及到socket编程,入行未深!希望各位可以帮忙!

PIPIONE 2023-01-03 17:13:09

socket通信分服务端和客户端,我对其超时设置是这样理解的,在客户端里面,我可以先设置超时设置,然后调用connect函数链接服务端,这个函数会在前面超时设置的时间内不停的connect服务端,如果超出时间限制则返回错误信息!是这样理解的吗?如果理解对的话那么在服务端怎么设置超时呢!服务端的流程是:也是想设置超时,然后调用bind 然后调用listen函数,这里那个部分用到了超时设置呢!什么地方超时返回呢!!
1 可能大部分人用的都是用select来设置超时!能不能就用这个给我讲解一下啊!  
2 其实我调用的socket函数是一个apr库里面的,超时设置是apr_socket_timeout_set函数,应该和正常情况下有个函数是对应起来的,只是我还不知道!如果有人知道的就更好了

查看完整描述

2 回答

?
侃侃无极

TA贡献1765条经验 获得超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;
}

 


查看完整回答
反对 回复 2023-01-06
?
墨色风雨

TA贡献1609条经验 获得超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中。

查看完整回答
反对 回复 2023-01-06

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信