我想请问下一个Socket编程的问题

diablox0147 2012-04-26 12:58:36
就是我在本地测试的时候,服务端用BeginReceive,如果突然把客户端关闭的话服务端就EndReceive会不停的返回0字节,而有时候发送的时候虽然在客户端没发送过空消息可是在服务端也会出现返回0字节的情况,有什么办法可以知道哪个是突然断开哪个是平常的发送吗?
...全文
83 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
orochiheart 2012-04-26
  • 打赏
  • 举报
回复
再细看看代码 单步调试看看有没有什么突破
test2050 2012-04-26
  • 打赏
  • 举报
回复
逻辑控制的问题。自己调整下代码
只在此山中 2012-04-26
  • 打赏
  • 举报
回复
返回0字节 就表示连接断开了,直接Socket.Close 就行.
love_4023 2012-04-26
  • 打赏
  • 举报
回复
你在断开的事件里面获取不到断开的那个socket信息么???
diablox0147 2012-04-26
  • 打赏
  • 举报
回复
我还有一个很重要的问题就是在调用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
}
diablox0147 2012-04-26
  • 打赏
  • 举报
回复
哦对了,还有一点必须说明下的就是就算客户端没断开连接也会出现0字节,就是我一直按住发送按键然后客户端不停的发送的时候。
diablox0147 2012-04-26
  • 打赏
  • 举报
回复
最烦的不是每次都出现阿,是有一定几率,有些时候是发挥一次0字节后结束了,而有时候是不停的返回
  • 打赏
  • 举报
回复
不停地返回?你的代码肯定是逻辑错误了。在服务器端,EndReceive会出现异常,然后此时服务器端捕获异常时就可以执行 Socket.Close 就行了。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧