求救:socket异步,通信到一半时,发生异常:System.Net.Sockets.SocketException (0x80004005):

JZ_7975 2014-09-22 02:28:04
服务端是异步Socket
和硬件设备进行照片的传输,总共的帧数是50帧左右,每帧是固定的249个字节,最后一帧不固定
服务端在收到硬件设备发送的报文时,会回发一个报文

当一切正常时,照片传输成功
当不正常时,在收到第5帧或者是第13帧后,回发报文后
无法接收到设备发送的报文
这个时候,异常指向
var bytesRead = Handler.EndReceive(ar);
异常信息为:

[2014-9-21 23:36:25] [INFO] 连接已断开了,请处理:System.Net.Sockets.SocketException (0x80004005): 远程主机强迫关闭了一个现有的连接。
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.Socket.Receive(Byte[] buffer)
at GSFTCollectionService.BLL.SocketServer.ReadCallback(IAsyncResult ar) in E:\新建文件夹\2014-08-20离线定位\GSFTCollectionService\BLL\SocketServer.cs:line 201


也就是说,这个时候,硬件设备和服务端的连接中断了
通过抓包工具发现,硬件设备已经发送了第7帧和第14帧的报文
但是由于连接中断,导致接收时异常

让我不解的是,我这里没有地方来控制断开硬件设备的连接
但是为什么连接会中断呢?
另外有没有可能是,硬件设备在发送了数据后,就断开了连接,
所以就导致了服务端对的连接中断?


...全文
4239 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
JZ_7975 2014-10-12
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
10秒是夸张的说法,正常设置超时时间都不会超过2秒 客户端发起一个请求,服务端没有响应,难道这时不重连,还要等10分钟没收到心跳才想起要重连吗
高手,问题还是存在,现在由于硬件设备的客户端已经发货,所以暂时无法修改 还是得从采集这里分析问题,能帮我分析分析吗?
JZ_7975 2014-10-12
  • 打赏
  • 举报
回复
引用 15 楼 jila520 的回复:
请问你题目中所提的抓包工具是用来做什么的?是什么工具?初学者,也正好要做socket编程,请教下,谢谢。
sniffer table
JZ_7975 2014-09-28
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
10秒是夸张的说法,正常设置超时时间都不会超过2秒 客户端发起一个请求,服务端没有响应,难道这时不重连,还要等10分钟没收到心跳才想起要重连吗
已经让硬件设备进行了相应的更改 另外在测试的过程中,还是发现了原来的问题,在异步接收的时候 Handler.Receive()报错,异常为:

连接已断开了,请处理:System.Net.Sockets.SocketException (0x80004005): 远程主机强迫关闭了一个现有的连接。
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.Socket.Receive(Byte[] buffer)
   at GSFTCollectionService.BLL.SocketServer.ReadCallback(IAsyncResult ar) in E:\新建文件夹\2014-08-20离线定位\GSFTCollectionService\BLL\SocketServer.cs:line 201
其中的201行就是 Handler.Receive() 请问,这个是什么原因
jila520 2014-09-28
  • 打赏
  • 举报
回复
请问你题目中所提的抓包工具是用来做什么的?是什么工具?初学者,也正好要做socket编程,请教下,谢谢。
JZ_7975 2014-09-22
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
10秒是夸张的说法,正常设置超时时间都不会超过2秒 客户端发起一个请求,服务端没有响应,难道这时不重连,还要等10分钟没收到心跳才想起要重连吗
说到点子上了,这样很好,至少重连的时间省了很多
於黾 2014-09-22
  • 打赏
  • 举报
回复
10秒是夸张的说法,正常设置超时时间都不会超过2秒 客户端发起一个请求,服务端没有响应,难道这时不重连,还要等10分钟没收到心跳才想起要重连吗
於黾 2014-09-22
  • 打赏
  • 举报
回复
何况客户端每发一个包,服务端都要回一个包,难道客户端不知道10秒了还没有收到服务端回发的包就应该重连了吗
於黾 2014-09-22
  • 打赏
  • 举报
回复
引用 8 楼 JZ_7975 的回复:
现在的处理机制是,如果10分钟设备没有收到服务端发送的心跳就重连 但是有个问题就是,重连后,还是有可能在5帧和第13帧的时候失败 就会导致2个小时,3张照片都传不上去
这个机制本身就很不靠谱 为什么是服务器端维持心跳?? 而且socket断开,不管是服务器端还是客户端,会立即知道,不用等10分钟没数据才知道断了啊
JZ_7975 2014-09-22
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
另外他的说法“没有断开连接”这是一个非常不靠谱的借口。如果服务器这边检测到断开了,那么设备那边肯定检测到断开了。难道他检测不到断开了? 他只是说他自己没有“故意”断开了,但是你告诉他“我没有说你故意断开连接啊?”。 他不懂技术,所以技术故障他说不清楚,只能说一些“是非”的话。你想让他客观地检测故障,而他理解成你在指责他故意断开连接。跟这种维护人员合作,比就容易出问题。
受益匪浅
JZ_7975 2014-09-22
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
各种问题都会导致连接中断,比如网络状况不好,或者网卡出现了不明原因的故障 你要做的工作不是保证硬件不出问题,那谁也保证不了 你要做的是,如果网络出现问题,如何重新连接, 重新连接后,是重新发送图片,还是断点续传 如果一旦断开就再也不连接了,那保证是客户端做的有问题啊 服务端总不能在断开后,主动向客户端发起连接吧 到底谁是客户端啊
现在的处理机制是,如果10分钟设备没有收到服务端发送的心跳就重连 但是有个问题就是,重连后,还是有可能在5帧和第13帧的时候失败 就会导致2个小时,3张照片都传不上去
我叫小菜菜 2014-09-22
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
各种问题都会导致连接中断,比如网络状况不好,或者网卡出现了不明原因的故障 你要做的工作不是保证硬件不出问题,那谁也保证不了 你要做的是,如果网络出现问题,如何重新连接, 重新连接后,是重新发送图片,还是断点续传 如果一旦断开就再也不连接了,那保证是客户端做的有问题啊 服务端总不能在断开后,主动向客户端发起连接吧 到底谁是客户端啊
没错,服务器主动向客户端发起连接请求,是非常不合理的! 通信中断,客户机只能重新建立连接,然后选择重传或者断点续传。 通信中断后,服务器是不会像客户端发起连接请求的,服务器只会保持session一段时间,然后从内存中清掉。。。如果这段时间内客户端向服务器发起连接请求,那么session再次延长有效期。如果session被清掉了,客户端再连接,就会重新开始会话。。。
於黾 2014-09-22
  • 打赏
  • 举报
回复
各种问题都会导致连接中断,比如网络状况不好,或者网卡出现了不明原因的故障 你要做的工作不是保证硬件不出问题,那谁也保证不了 你要做的是,如果网络出现问题,如何重新连接, 重新连接后,是重新发送图片,还是断点续传 如果一旦断开就再也不连接了,那保证是客户端做的有问题啊 服务端总不能在断开后,主动向客户端发起连接吧 到底谁是客户端啊
JZ_7975 2014-09-22
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
[quote=引用 2 楼 JZ_7975 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 问问你们公司的硬件工程师 不就知道了。这样软,硬件交互工作需要协同。
硬件工程师在分公司 他的说法是,没有断开连接。。。。[/quote] 那你就问他“服务器断开的几率比设备断开的几率高几十倍呢?”。你告诉它“其它设备没有断开”。[/quote] 也就是说,逼着他一起来分析问题,而不是一句话就完了?
  • 打赏
  • 举报
回复
另外他的说法“没有断开连接”这是一个非常不靠谱的借口。如果服务器这边检测到断开了,那么设备那边肯定检测到断开了。难道他检测不到断开了? 他只是说他自己没有“故意”断开了,但是你告诉他“我没有说你故意断开连接啊?”。 他不懂技术,所以技术故障他说不清楚,只能说一些“是非”的话。你想让他客观地检测故障,而他理解成你在指责他故意断开连接。跟这种维护人员合作,比就容易出问题。
  • 打赏
  • 举报
回复
引用 2 楼 JZ_7975 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 问问你们公司的硬件工程师 不就知道了。这样软,硬件交互工作需要协同。
硬件工程师在分公司 他的说法是,没有断开连接。。。。[/quote] 那你就问他“服务器断开的几率比设备断开的几率高几十倍呢?”。你告诉它“其它设备没有断开”。
JZ_7975 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
问问你们公司的硬件工程师 不就知道了。这样软,硬件交互工作需要协同。
硬件工程师在分公司 他的说法是,没有断开连接。。。。
  • 打赏
  • 举报
回复
问问你们公司的硬件工程师 不就知道了。这样软,硬件交互工作需要协同。

111,093

社区成员

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

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

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