在.net framework1.1下写的服务器端,客户端是GPRS专线.服务器端监听之后,若有gprs连接上来,endaccept,插入arraylist中,beginreceive.但我用netstat -an 察看连接数时发现了异常.有几个连接是syn_received状态,并且很快就消失了.造成用netstat看到的连接数跟我链表中的数量不一致.按照道理,我endaccept应该就是建立了连接,客户端断开,不管是多久断开的,我在receive回调函数中应该能收到断开的异常或者消息,但我根本没收到:(
困惑了很久,不知道是什么原因,使用APN为cmnet的gprs连接时,就没有这种情况,不知道大家有没有遇到这种情况.我暂时解决的方法就是10分钟没有数据的收发,我就断开连接.但这样做还是太武断了.用的是win2000操作系统

解决方案 »

  1.   

    使用Nonblocking, zero-byte Send call, 如果成功返回,或者抛出WAEWOULDBLOCK,错误码10035,就说明连接正常,否则,客户端已经终止连接。注意,因为Tcp/IP协议中,客户端和服务端的Socket是分别控制的,除了发送试探信息,你无法知道客户端是否断开。
      

  2.   

    // 这里的client是一个Socket类,这里使用同步方式
    client.Connect(anEndPoint);// 检查状态代码
    bool blockingState = client.Blocking; // 暂存客户端的状态
    try
    {
        byte [] tmp = new byte[1];    client.Blocking = false; // 使用无阻塞发送
        client.Send(tmp, 0, 0);  // 发送
        Console.WriteLine("Connected!"); // 发送成功,则连接正常
    }
    // 如果抛出异常,进行检测
    catch (SocketException e) 
    {
        // 10035 == WSAEWOULDBLOCK 连接正常,但是发送被客户端阻塞
        if (e.NativeErrorCode.Equals(10035))
            Console.WriteLine("Connected!");
        else
        {   // 客户端已经断开连接
            Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
        }
    }
    finally
    {   // 恢复原来的状态
        client.Blocking = blockingState;
    } Console.WriteLine("Connected: {0}", client.Connected);
      

  3.   

    恩 用发送小字节数来试探的方法是可以的,但这种方法对gprs来说很费流量。我也考虑过,最终用户还是拒绝了。
    另外我还想问一下,明明操作系统底层已经知道断开了,netstat里也没有了这个连接,为什么我会收不到呢,是socket没有做好呢,还是什么其它的原因以至于我没收到断开的信息?下班有点事情出去了,没来得及回复。
      

  4.   

    两种方式
    一。约定一个小数据包,作为服务器客户端之间的通信包。
    二。模拟TCP底层的保活定时器,发送数据来探测