天杀的!!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毫秒,就结束了,没有收到任何数据。
...全文
1467 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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? 估计只有高手中的高手才知道这个问题的答案。 可惜我的分不够了。
内容概要:本文详细介绍了名为MoSca的系统,该系统旨在从单目随意拍摄的视频中重建和合成动态场景的新视角。MoSca通过4D Motion Scaffolds(运动支架)将视频数据转化为紧凑平滑编码的Motion Scaffold表示,并将场景几何和外观与变形场解耦,通过高斯融合进行优化。系统还解决了相机焦距和姿态的问题,无需额外的姿态估计工具。文章不仅提供了系统的理论背景,还给出了基于PyTorch的简化实现代码,涵盖MotionScaffold、GaussianFusion、MoScaSystem等核心组件。此外,文中深入探讨了ARAP变形模型、2D先验到3D的提升、动态高斯表示、相机参数估计等关键技术,并提出了完整的训练流程和性能优化技巧。 适用人群:具备一定计算机视觉和深度学习基础的研究人员和工程师,特别是对动态场景重建和新视角合成感兴趣的从业者。 使用场景及目标:①从单目视频中重建动态场景的新视角;②研究和实现基于4D Motion Scaffolds的动态场景表示方法;③探索如何利用预训练视觉模型的先验知识提升3D重建质量;④开发高效的动态场景渲染和优化算法。 其他说明:本文提供了详细的代码实现,包括简化版和深入扩展的技术细节。阅读者可以通过代码实践加深对MoSca系统的理解,并根据具体应用场景调整和扩展各个模块。此外,文中还强调了物理启发的正则化项和多模态先验融合的重要性,帮助实现更合理的变形和更高质量的渲染效果。

111,094

社区成员

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

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

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