说一个丢人现眼的错误

用socket做网络应用程序,发送和接收超时好办,Connect超时目前找来找去只有select这招了

于是,用到了timeval这个家伙。

 

起初我以为,要粗略设置秒数,就用tv_sec成员,要精确到百万分之一秒,就用tv_usec,结果设置为1秒的时候

	FD_ZERO(&fs);
	FD_SET(sock, &fs);
	tv.tv_sec = 0;
	tv.tv_usec = 1000000;
	ret = select(0, 0, &fs, 0, &tv);
	if(ret <= 0)
	{	// 链接超时
		closesocket(sock);
		return FALSE;
	}


编译为debug,运行正常,1秒后超时返回;编译为release问题就来了,一般等待20多秒,丫丫的

查百度,谷歌未果;查MSDN->NULL

于是自己试试,发现跟64位那个结构体差不多,一个高32位一个低32位;这里是一个秒数部分,一个微秒部分……

 

	FD_ZERO(&fs);
	FD_SET(sock, &fs);
	ret = dwConnTime / 1000000;
	tv.tv_sec = (long)ret;	//timeval结构体是多少秒又多少微秒
	ret = dwConnTime % 1000000;
	tv.tv_usec = (long)ret;	//精度百万分之一秒
	ret = select(0, 0, &fs, 0, &tv);
	if(ret <= 0)
	{
		closesocket(sock);
		return FALSE;
	}


这样就ooxx了!

你可能感兴趣的:(说一个丢人现眼的错误)