网络通信如何设定超时

来源:百度知道 编辑:UC知道 时间:2024/06/11 01:49:42
我写的一段程序
cmpp_status_t cmpp_recv(cmpp_conn* conn, cmppg_ismg_packet* cp, cmpp_uint32_t nTimeOut)
{
clock_t start, finish; //记下程序运行时间
start = clock(); //程序开始时间
char recvBuf[500]={0};
//接受从ISMG发来的包
int nCount = ::recv(conn->hSocket, recvBuf, 500, 0);
cmppg_deliver* cd = (cmppg_deliver*)recvBuf; //将其转化为cmppg_deliver包
end=clock();
return CMPP_SUCCESS;
}
我想让end与start之间的时间不能超过nTimeOut,超过就返回超时状态直接结束,可是recv方法接受不到数据它就一直在哪儿等,程序无法向下执行,也就无法计时,怎么才能设定一个时间段让它跳出recv方法呀,谁能告诉我,菜鸟求助中……

winsock有自带setsockopt函数的, 用来设置send和recv的属性
函数原形是:
int setsockopt(
__in SOCKET s,
__in int level,
__in int optname,
__in const char* optval,
__in int optlen
);
其中optname有SO_RCVTIMEO和SO_SNDTIMEO两项, 是用来设置发送超时和接收超时的

你可以用select函数. select可以设定一个超时时限,然后试探socket是否有数据可以recv. 当select超时并且还没有数据传过来时,就可以判定超时退出.