socket的接受0字节的处理

lihbwork163 2012-08-13 09:38:43
初学socket 开发
遇到一个问题:
问题描述:
当服务器接受了客户端的连接之后,进入循环接收数据过程中,
在一下情况下:
1)客户端异常退出。
2)客户端正常退出,但是没有通知服务器端。
服务器端接收数据都出现接受0字节,并且由阻塞进入到无线循环当中。
代码如下:
while (true)
{
try
{
if (handler.Poll(-1, SelectMode.SelectRead))
{
int bytesRec = handler.Receive(bytes);
data = Encoding.ASCII.GetString(bytes, 0, bytesRec);
Console.WriteLine("Text received : {0}", data);
if (data == "exit")
{
Console.WriteLine("客户端请求连接断开!");
break;
}
handler.Send(Encoding.ASCII.GetBytes(data));
}
}
catch (Exception err)
{
Console.WriteLine("Client Err:" + err.Message.ToString());
break;
}
}

另外handler.Poll(-1, SelectMode.SelectRead),是什么作用,根据MSDN的解释判断socket的状态,但是我并没理解他的用途,去掉它似乎也可以,阻塞停留在handler.Receive而已,依然没有任何的影响。
...全文
656 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihbwork163 2012-08-14
  • 打赏
  • 举报
回复
我测试了几多情况,
发送零字节,对方无任何反应,阻塞并不触发滴,
另外接受到0自己基本就是对方或者网络有问题了。
直接重建连接好了,
不知道高手们是否认同该观点。感谢zanfeng的关注啊。
lihbwork163 2012-08-13
  • 打赏
  • 举报
回复
确信是微软的一个BUG?
有解决方案不?
足球中国 2012-08-13
  • 打赏
  • 举报
回复
.net 的一个bug很早就有。一直都没有解决。
lihbwork163 2012-08-13
  • 打赏
  • 举报
回复
我的问题不是这个,
我的问题核心在于,客户端已经断开了,服务器端通过什么方式知道它断开了,
在客户端断开的情况下,
handler.Receive和handler.Send依然可以正常工作。
bdmh 2012-08-13
  • 打赏
  • 举报
回复
你可以用异步接收AcceptAsync ,或者设置接收或发送超时ReceiveTimeout SendTimeout
失落的神庙 2012-08-13
  • 打赏
  • 举报
回复
采用心跳机制
足球中国 2012-08-13
  • 打赏
  • 举报
回复
还有不少BUG。比如返回值有几个亿的那种大值在大并发的时候会出现。
这个需要处理经验。codeproject之前讨论很久。
足球中国 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

确信是微软的一个BUG?
有解决方案不?
[/Quote]
是零的不处理就好了。
lihbwork163 2012-08-13
  • 打赏
  • 举报
回复
木人回答么?

110,566

社区成员

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

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

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