使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
from:http://blog.sina.com.cn/s/blog_8043547601015m0g.html
当使用TCP套接字时,当无网络连接时,还会继续send,继续recv阻塞,知道TCP自己协议机制判断断开连接时才会停止发送和接收,时间需要几分钟之久。
解决的办法是,自己设置接收超时时间,当超时后重新发送,或者从新初始化socket然后在重新创建socket重新connect。
代码如下:
但是编译会出错,perror显示参数错误(
Invalid argument
),看了下内核中的实现,参数确实错了,其中最后一个参数是sizeof(
struct timeval) 类型的,而非其他类型
改正为:
struct timeval tv;
然后最后个参数写为:
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout, sizeof(tv));
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout,
参数解析:
1)
int s :sockfd,即socket文件描述符
2)
int level :
SOL_SOCKET(通用套接字) ,IPPROTO_TCP,等
3)
int optname
:
SO_SNDTIMEO(发送超时时间)|
SO_RSVTIMEO(接收超时时间)等,设置选项,
4)
const void *optval :自定义的超时时间的地址
5)
struct timeval的大小,即
sizeof(struct timecal)