我想写个socket长连接客户端程序,其中有两个线程,一个是接收数据的,使用的是阻塞式接收;另一个是负责链路检测的,在指定时间下给服务器发送一个数据包,判断连接有没有断开,并且把socket的阻塞式接收改为非阻塞式接收,希望在接收数据的线程里能在指定超时的时间内接收到数据,如果没有接收到就断开连接。可是这不起作用,接收数据的线程还是处于阻塞式状态,请问我该怎么做呢?

解决方案 »

  1.   

    想得太复杂!
    做成事件方式就简单了,看看一些稳定关于SOCKET的组件,用它就可了!
      

  2.   

    不用单独的线程去判断是不是连接的吧ReceiveTimeout属性可以设置超时时间
      

  3.   

    do{
    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);
    被动断开可以这样判断的
      

  4.   

    ///////////心跳
    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);