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

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

PIPIONE
浏览 273回答 2
2回答

侃侃无极

有个例子,你看一下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;} 

墨色风雨

举例: 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中。
打开App,查看更多内容
随时随地看视频慕课网APP