当服务端
  private TcpListener m_server = null;
  Socket clientSocket = null;
  clientSocket = m_server.AcceptSocket();
如上代码,服务端新监听一个链接后,如果客户端断开了。。
服务端怎么判断它已经断开,不再监听?
谢谢~~~!~
建立连接的时候对所有客户端对象肯定有个列表了。然后每当你断开一个client时就从列表里删去相应的对象。
对于异常断开的情况,则需要你有检测机制了。比如不断检测你的连接的状态。一旦是断开的,就从对象列表里,把相应对象删去。

解决方案 »

  1.   

    校验的,把c代码改一下吧。char *  用string代替。
      

  2.   

    客户端断开主要有三种情况:一是客户端调用Close()正常断开,这样服务端的Receive()会返回一个0字节的数据包。二是客户端崩溃,这样服务端会引发一个Socket异常。
    你只要处理这两种情况就可以判断客户端是否断开。三是网络异常断开,这个你可以去看看我的Blog。第二个问题:
    用Byte数组代替Char*,用UInt16代替unsigned short,其它的就没多少变动了!
      

  3.   

    @whChina
    我现在就是服务端客户端断开了,我服务端还会去给它发接数据。。闷,,
    客户端是嵌入设备。。那个校验的,我改成如下了。不对!
    希望有人帮忙改下。 ushort crc16(byte[] sc, int il)
            {
                ushort usSum;            usSum = 0xFFFF;           
                if (sc.Length == 0) return 0;
                if (il <= 0) return 0;            for (; il > 0; il--)
                {
                    byte r, bit;                usSum = (ushort)(usSum ^ (ushort)sc[il-1]);
                    for (r = 0; r < 8; r++)
                    {
                        bit = (byte)(usSum & 1);
                        usSum = (ushort)((usSum >> 1) & 0x7FFF);
                        if (bit != 0)
                            usSum = (ushort)(usSum ^ 0xA001);
                    }         
                }
                return usSum;            
            }
      

  4.   

    public static ulong GetCRC32(string sInputString)
            {
                //生成码表
                GetCRC32Table();
                byte[] buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(sInputString);
                ulong value = 0xffffffff;
                int len = buffer.Length;
                for (int i = 0; i < len; i++)
                {
                    value = (value >> 8) ^ Crc32Table[(value & 0xFF) ^ buffer[i]];
                }
                return value ^ 0xffffffff;
            }