最近在RHEL5下面,遇到了将网络拔掉,socket的send函数在发送小包数据的时候,依然能够成功;而在发送大包的时候,却需要很久才会超时退出阻塞状态。
首先这里有两个问题:
1.send小包数据时,一定会成功,无法判断网络连接正常
2.send大包数据时,会阻塞很久,才会退出
解决问题1,需要自己做心跳机制,比较好解决。
解决问题2,需要用到setsockopt函数来设置发送超时值
#ifndef _WIN32
struct timeval timeout;
timeout.tv_sec = mSeconds / 1000;
timeout.tv_usec = (mSeconds % 1000) * 1000;
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(struct timeval));
#else
int timeout = mSeconds;
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(int));
#endif//_WIN32