天杀的!!Socket tcp 接收函数Receive 没有收到数据也没有阻塞 这是为什么

FelixMaster 2016-12-02 05:25:37
我的C#代码如下:

...
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string recvStr="";
int bytes ;
...
c.Send(bs, bs.Length, 0);//发送测试信息
Stopwatch sw = new Stopwatch();
sw.Start();
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
sw.Stop();
TimeSpan ts2 = sw.Elapsed;
Console.WriteLine("only one resaved: " + bytes.ToString() + recvStr+"time:" + ts2.TotalMilliseconds.ToString());


输出结果为:only one resaved: 0time:0.0046
Receive 函数只执行了 0.0046毫秒,就结束了,没有收到任何数据。
...全文
1246 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2016-12-05
  • 打赏
  • 举报
回复
这不很正常么.. 因为你只"接收"了一次..在你接收的时候 服务器并没有给你返回任何东西... 所以没有输出任何数据 也是符合你的测试情况. 所以你要实现的是"一直"接收.当然那种while的方式 是可以实现. 但是也只能说是"实现"而已..并不能实际应用. 正常的 是采用异步的方式. 比如 BeginAccept 以及BeginReceive. 具体的 请参考.http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
没收到数据时, bytes=0, 这表示连接断开了.
对于这种情况又什么解决方案吗? 难道在接收的地方加一个while(true) ... break; ?
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 4 楼 crystal_lz 的回复:
习惯就好 连接估计被断开了 通常情况下断开会产生异常 但是又时候确实没有异常
难道真的没有解决办法了?
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
我看到以前也有个人遇到过这种情况,但是没有解决方案。 http://bbs.csdn.net/topics/390362096 多谢各位高手的热心帮忙。结贴了先。
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 14 楼 knf 的回复:
这么多人不了解socket的同步模式?当没有数据返回时,应该是处于阻塞状态,一直停留在recvice。如果recvice的byte=0,那就说明连接断了。
所以这是网络问题,只能当做连接中断处理?只能重新连接?
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 10 楼 crystal_lz 的回复:
[quote=引用 5 楼 u010504924 的回复:] [quote=引用 4 楼 crystal_lz 的回复:] 习惯就好 连接估计被断开了 通常情况下断开会产生异常 但是又时候确实没有异常
难道真的没有解决办法了?[/quote] 收到空数据那就自己跳出呗 而且出现这种情况很正常 在网络情况比较复杂的时候 被非正常的方式断开连接 出现这种情况的几率很大 而且recvice值主动等待数据 begin是有数据通知你 既然你采用了recvice方式 那么你就得接收这种情况的出现 并且处理好[/quote] “而且recvice值主动等待数据 begin是有数据通知你” 这句是什么意思呢?begin是指的什么呢? 收到空数据通常是网络情况糟糕导致的是吗?如果真是网络情况不好导致的,那么估计是通讯程序个数到达极限了,不能再增加了(我是负载测试的时候发现的这个问题)。
knf 2016-12-05
  • 打赏
  • 举报
回复
这么多人不了解socket的同步模式?当没有数据返回时,应该是处于阻塞状态,一直停留在recvice。如果recvice的byte=0,那就说明连接断了。
tcmakebest 2016-12-05
  • 打赏
  • 举报
回复
引用 6 楼 u010504924 的回复:
[quote=引用 2 楼 tcmakebest 的回复:] 没收到数据时, bytes=0, 这表示连接断开了.
对于这种情况又什么解决方案吗? 难道在接收的地方加一个while(true) ... break; ?[/quote] 连接正常关闭就是这样的, 这是肯定要处理的, 这种情况难道从来没考虑过吗
  • 打赏
  • 举报
回复
public int Receive( byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode ) 用这个重载看看errorCode
SoulRed 2016-12-05
  • 打赏
  • 举报
回复
你这是用的主动式轮询网络操作,你必须用while 不停的查询执行才可以让他一直工作。 如果你想高性能和被动式,请用SocketAsyncEventArgs 。参考 http://www.cnblogs.com/smark/p/3573107.html https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx
crystal_lz 2016-12-05
  • 打赏
  • 举报
回复
引用 5 楼 u010504924 的回复:
[quote=引用 4 楼 crystal_lz 的回复:] 习惯就好 连接估计被断开了 通常情况下断开会产生异常 但是又时候确实没有异常
难道真的没有解决办法了?[/quote] 收到空数据那就自己跳出呗 而且出现这种情况很正常 在网络情况比较复杂的时候 被非正常的方式断开连接 出现这种情况的几率很大 而且recvice值主动等待数据 begin是有数据通知你 既然你采用了recvice方式 那么你就得接收这种情况的出现 并且处理好
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
这不很正常么.. 因为你只"接收"了一次..在你接收的时候 服务器并没有给你返回任何东西... 所以没有输出任何数据 也是符合你的测试情况. 所以你要实现的是"一直"接收.当然那种while的方式 是可以实现. 但是也只能说是"实现"而已..并不能实际应用. 正常的 是采用异步的方式. 比如 BeginAccept 以及BeginReceive. 具体的 请参考.http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html
如果没有收到数据,那么程序会停在Receive 这个函数这里。
FelixMaster 2016-12-05
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
这不很正常么.. 因为你只"接收"了一次..在你接收的时候 服务器并没有给你返回任何东西... 所以没有输出任何数据 也是符合你的测试情况. 所以你要实现的是"一直"接收.当然那种while的方式 是可以实现. 但是也只能说是"实现"而已..并不能实际应用. 正常的 是采用异步的方式. 比如 BeginAccept 以及BeginReceive. 具体的 请参考.http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html
Receive 是同步模式,没有收到数据是不正常的;而且服务端是一直在发送数据的。
crystal_lz 2016-12-02
  • 打赏
  • 举报
回复
习惯就好 连接估计被断开了 通常情况下断开会产生异常 但是又时候确实没有异常
FelixMaster 2016-12-02
  • 打赏
  • 举报
回复
这个问题是我做负载测试的时候才遇到的。如果只是单独运行一个程序没有这种错误。
tcmakebest 2016-12-02
  • 打赏
  • 举报
回复
没收到数据时, bytes=0, 这表示连接断开了.
FelixMaster 2016-12-02
  • 打赏
  • 举报
回复
这是不是微软windows系统的Bug? 估计只有高手中的高手才知道这个问题的答案。 可惜我的分不够了。

110,545

社区成员

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

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

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