我想写个socket长连接客户端程序,其中有两个线程,一个是接收数据的,使用的是阻塞式接收;另一个是负责链路检测的,在指定时间下给服务器发送一个数据包,判断连接有没有断开,并且把socket的阻塞式接收改为非阻塞式接收,希望在接收数据的线程里能在指定超时的时间内接收到数据,如果没有接收到就断开连接。可是这不起作用,接收数据的线程还是处于阻塞式状态,请问我该怎么做呢?
调试欢乐多
做成事件方式就简单了,看看一些稳定关于SOCKET的组件,用它就可了!
len=recv(theApp.m_socket.sClient,buffer,1024,0);
if (len == -1 || len == 0 || (len == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) {
// Client socket closed
struct linger lig;
int iLen;
lig.l_onoff=1;
lig.l_linger=0;
iLen=sizeof(struct linger);
setsockopt(sClient,SOL_SOCKET,SO_LINGER,(char *)&lig,iLen);
//关闭
closesocket(sClient);
break;
}
else
{
buffer[len]='\0';
rData+=buffer;
} }while(true);
被动断开可以这样判断的
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)1500).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)8000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2); //8000代表8秒
socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
///////int n = socket.Receive(tempBuf, 0, 1024, SocketFlags.None);