我引用了wwwllg的代码,为的是解决UDP传输中超时的问题,也即如果A计算机发给B(A和B在同一个局域网内,如果5s内B没有反馈,那么就认为网络不通)我把代码改了一下,写在下面。我在测试的时候,即使B关机,函数返回值仍旧是true(也即连通),不知为何,麻烦各位指教一下,谢谢bool CNetCommCtrl::NetCheck(SOCKET m_Socket)//m_Socket是A上的socket { unsigned long ul = 1; int ret = ioctlsocket(m_Socket, FIONBIO, (unsigned long*)&ul); SOCKADDR_IN trcSocket;
我现在不知道用什么技术检测超时
用setTimer吗?
我引用了wwwllg的代码,为的是解决UDP传输中超时的问题,也即如果A计算机发给B(A和B在同一个局域网内,如果5s内B没有反馈,那么就认为网络不通)我把代码改了一下,写在下面。我在测试的时候,即使B关机,函数返回值仍旧是true(也即连通),不知为何,麻烦各位指教一下,谢谢bool CNetCommCtrl::NetCheck(SOCKET m_Socket)//m_Socket是A上的socket
{
unsigned long ul = 1;
int ret = ioctlsocket(m_Socket, FIONBIO, (unsigned long*)&ul);
SOCKADDR_IN trcSocket;
if(ret==SOCKET_ERROR)
{
int erro = WSAGetLastError();
TRACE("ioctlsocket erro\n");
ASSERT(FALSE);
return false;
}
trcSocket.sin_addr.s_addr= inet_addr("192.168.0.25");//B机器的IP
trcSocket.sin_family = PF_INET;
trcSocket.sin_port = htons(UDP_PORT_NUM);
connect(m_Socket,(struct sockaddr*)&trcSocket,sizeof(trcSocket)); struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(m_Socket, &r);
timeout.tv_sec = 5; //连接超时5秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if(ret <= 0)
{
int ret = WSAGetLastError();
TRACE("连接失败: %d\n",ret);
return false;
}
return true;}
如果我用SetTimer解决这个问题,定时器设为5s,到第5s转到消息处理函数,之后关闭定时器我应该在什么地方启动这个定时器呢?
UDP传输程序一启动,我开启3个线程,一个用于接收报文,一个用于发送报文,一个用于处理接收到的报文谢谢!