本帖最后由 diablox0147 于 2012-04-26 03:07:51 编辑

解决方案 »

  1.   

    不停地返回?你的代码肯定是逻辑错误了。在服务器端,EndReceive会出现异常,然后此时服务器端捕获异常时就可以执行 Socket.Close 就行了。
      

  2.   

    你在断开的事件里面获取不到断开的那个socket信息么???
      

  3.   

    返回0字节 就表示连接断开了,直接Socket.Close 就行.
      

  4.   

    我还有一个很重要的问题就是在调用Send之后是不是底层只是把要发送的字节压入TCP缓冲后就直接返回了? 
    因为有时候客户端会收不到来自服务端的有效消息,就是在服务端确认客户端之后。连续发送的2次数据包,在客户端有时候会没办法收到有效的确认登录的包        private void SendIdentifyInformationAndBeginHandle(playerInformation player)
            {
                    MakeMsgPacket(player, BitConverter.GetBytes(player.ID), 1, 99);                player.SOCKET.Send(player.BUFF, player.AvailableDataInBuff, SocketFlags.None);//envoyer les donnees importants aux nouveaux joueur, et a partir de now, is me handle you
                    MakeMsgPacket(player, Encoding.ASCII.GetBytes("Good work, you are now identified in server, and your id is "+player.ID), 1, 1001);
                    player.SOCKET.Send(player.BUFF, player.AvailableDataInBuff, SocketFlags.None);
                    Console.WriteLine("Identifie send, player " + player.Name + " is identified");
                    player.Etat = playerInformation.ETAT.FREE;
                    player.SOCKET.BeginReceive(player.BUFF, 0, MessageHead.SIZE, SocketFlags.None, AsynReceiveHead, player);//on commence a recevoir des requetes de client
            }