欢迎来到天天文库
浏览记录
ID:48009770
大小:478.70 KB
页数:14页
时间:2020-01-13
《网络超时检测.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、网络超时检测在网络通信过程中,经常会出现不可预知的各种情况。例如网络线路突发故障、通信一方异常结束等。一旦出现上述情况,很可能长时间都不会收到数据,而且无法判断是没有数据还是数据无法到达。如果使用的是TCP协议,可以检测出来;但如果使用UDP协议的话,需要在程序中进行相关检测。所以,为避免进程在没有数据时无限制的阻塞,使用网络超时检测很有必要。1、套接字接收超时检测这里先介绍设置套接字选项的函数setsockopt()函数:#include所需头文件#include2、socket.h>intsetsockopt(intsockfd,intlevel,intoptname,函数原型constvoid*optval,socklen_toptlen);sockfd:套接字描述符level:选项所属协议层函数参数optval:保存选项值的缓冲区optlen:选项值的长度成功:0函数返回值出错:-1,并设置errno下面是套接字常用选项及其说明:LEVEL:SOL_SOCKET选项名称说明数据类型SO_BROADCAST允许发送广播数据intSO_DEBUG允许调试intSO_3、DONTRUOTE不查找路由intSO_ERROR获得套接字错误intSO_KEEPALIVE保持连接intSO_LINGER延迟关闭连接structlingerSO_OOBINLINE带外数据放入正常数据流intSO_RCVBUF接收缓冲区大小intSO_SNDBUF发送缓冲区大小intSO_RCVTIMEO接收超时structtimevalSO_SNDTIMEO发送超时structtimevalSO_REUSERADDR允许重用本地地址和端口intSO_TYPE获得套接字类型int下面利用SO_RCV4、TIMEO的选项实现套接字的接收超时检测:[cpp]viewplaincopy1.#include2.#include3.#include4.#include5.#include6.#include7.#include8.#include9.#defineN6410.#definePORT888811.12.intmain5、()13.{14.intsockfd;15.charbuf[N];16.structsockaddr_inseraddr;17.structtimevalt={6,0};18.19.if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)20.{21.perror("socketerror");22.exit(-1);23.}24.else25.{26.printf("socketsuccessfully!");27.printf("sockfd:%d",sock6、fd);28.}29.30.memset(&seraddr,0,sizeof(seraddr));31.seraddr.sin_family=AF_INET;32.seraddr.sin_port=htons(PORT);33.seraddr.sin_addr.s_addr=htonl(INADDR_ANY);34.35.if(bind(sockfd,(structsockaddr*)&seraddr,sizeof(seraddr))==-1)36.{37.perror("binderror");38.e7、xit(-1);39.}40.else41.{42.printf("bindsuccessfully!");43.printf("PORT:%d",PORT);44.}45.46.if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&t,sizeof(t))<0)47.{48.perror("setsockopterror");49.exit(-1);50.}51.52.if(recvfrom(sockfd,buf,N,0,NULL,NULL)<0)53.{548、.perror("failtorecvfrom");55.exit(-1);56.}57.else58.{59.printf("recvdata:%s",buf);60.}61.62.return0;63.}执行结果如下:[cpp]viewplaincopy1.fs@ubuntu:~/qiang/socket/time$./setsockopt2.socketsuccessfully!3.sockfd:34.bindsuc
2、socket.h>intsetsockopt(intsockfd,intlevel,intoptname,函数原型constvoid*optval,socklen_toptlen);sockfd:套接字描述符level:选项所属协议层函数参数optval:保存选项值的缓冲区optlen:选项值的长度成功:0函数返回值出错:-1,并设置errno下面是套接字常用选项及其说明:LEVEL:SOL_SOCKET选项名称说明数据类型SO_BROADCAST允许发送广播数据intSO_DEBUG允许调试intSO_
3、DONTRUOTE不查找路由intSO_ERROR获得套接字错误intSO_KEEPALIVE保持连接intSO_LINGER延迟关闭连接structlingerSO_OOBINLINE带外数据放入正常数据流intSO_RCVBUF接收缓冲区大小intSO_SNDBUF发送缓冲区大小intSO_RCVTIMEO接收超时structtimevalSO_SNDTIMEO发送超时structtimevalSO_REUSERADDR允许重用本地地址和端口intSO_TYPE获得套接字类型int下面利用SO_RCV
4、TIMEO的选项实现套接字的接收超时检测:[cpp]viewplaincopy1.#include2.#include3.#include4.#include5.#include6.#include7.#include8.#include9.#defineN6410.#definePORT888811.12.intmain
5、()13.{14.intsockfd;15.charbuf[N];16.structsockaddr_inseraddr;17.structtimevalt={6,0};18.19.if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)20.{21.perror("socketerror");22.exit(-1);23.}24.else25.{26.printf("socketsuccessfully!");27.printf("sockfd:%d",sock
6、fd);28.}29.30.memset(&seraddr,0,sizeof(seraddr));31.seraddr.sin_family=AF_INET;32.seraddr.sin_port=htons(PORT);33.seraddr.sin_addr.s_addr=htonl(INADDR_ANY);34.35.if(bind(sockfd,(structsockaddr*)&seraddr,sizeof(seraddr))==-1)36.{37.perror("binderror");38.e
7、xit(-1);39.}40.else41.{42.printf("bindsuccessfully!");43.printf("PORT:%d",PORT);44.}45.46.if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&t,sizeof(t))<0)47.{48.perror("setsockopterror");49.exit(-1);50.}51.52.if(recvfrom(sockfd,buf,N,0,NULL,NULL)<0)53.{54
8、.perror("failtorecvfrom");55.exit(-1);56.}57.else58.{59.printf("recvdata:%s",buf);60.}61.62.return0;63.}执行结果如下:[cpp]viewplaincopy1.fs@ubuntu:~/qiang/socket/time$./setsockopt2.socketsuccessfully!3.sockfd:34.bindsuc
此文档下载收益归作者所有