在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:
在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
这样做在Linux环境下是不会产生效果的,须如下定义:struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
有两点注意就是:
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
相关推荐
setsockopt函数使用说明 setsockopt函数使用说明
setsockopt详解 设置套接口的选项. setsockopt()函数用于任意类型、任意状态套接口的设置选项值
详细介绍setsockopt&getsockopt函数的用法, 一看就会用。。
setsockopt()改善程序的健壮性 ,详细介绍了这个函数的各种实用方法,配备了非常丰富的例子。
主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
setsockopt 设置socket 详细用法.doc
setsockopt参数详解 该函数不同参数所对应的意思,以及部分举例等。。 较为全面。
在TCP/IP网络编程中,利用setsockopt()函数,设置套接字的属性,可以修改发送缓存,接受缓存的大小,发送等待时间...
Linux kernel ip_setsockopt()整数溢出漏洞.pdf
易语言socket连接超时例程源码,socket连接超时例程,子程序1,socket,htons,inet_addr,Connect,closesocket,WSAStartup,setsockopt,ioctlsocket,select
文档中详细描述了VC环境下组播通信的实现方法,文档中包含程序代码,以编译通过。
setsockopt()教程_棒.zip
linux网络编程通过setsockopt函数使socket号重用.docx
JNASockOpt.setSockOpt(sock, JNASockOptionLevel.SOL_SOCKET, JNASockOption.SO_RCVBUF, 6553600); ... JNASockOpt.setSockOpt(sock, JNASockOptionLevel.SOL_TCP, JNASockOption.TCP_KEEPIDLE, 60); 如果不支持套...
易语言winsock登录淘宝源码,winsock登录淘宝,子程序_发送封包,URL编码,WSAStartup,closesocket,socket,gethostbyname,htons,connect,setsockopt,send,recv,WSACleanup,RtlMoveMemory_HOSTENT,RtlMoveMemory_整数,...
一片不错的socket编程文章一片不错的socket编程文章
iRet = recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ; if( iRet == SOCKET_ERROR ) { dwErr = WSAGetLastError() ; sprintf( szErr , "Error recv() = %ld " , dwErr ) ; continue ; } else ...
摘要视图订阅登录 | 注册(9)网络编程(2)102506次千里之外7篇5篇0篇20条setsockopt :SO_LINGER 选项设置 hongzi的专