读书人

C\S 程序中出现socket 无法从传输连

发布时间: 2013-09-14 13:03:22 作者: rapoo

C\S 程序中,出现socket 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接 问题
现为一个小公司做了一个C\S管理程序, 通过Socket 通信,在开发机器上测试时,一切正常(服务器和客户端都在同一台开发主机上)。但是当将服务器端移植到专门的主机上后, 服务器端经常出现该异常。
我已经将客户端发送消息的时候,将发消息所在的线程睡了30秒。 但还是出现这样的问题。
请问这是不是 那个服务器所在的主机系统主动将我的服务器端与客户端通信的连接关闭?
请问这需要怎么结局?


System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- 内部异常堆栈跟踪的结尾 ---
在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
在 System.IO.BinaryReader.ReadBytes(Int32 count)
在 System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser input)
在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord()
在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)

[解决办法]
关注,以前也遇到此问题,未能解决。
[解决办法]
在和设备通信的时候遇到过,结果是设备那端解决的,也就是socket的服务器端
可以看看服务器上是否有开防火墙,关掉试试

另外在客户端对socket发送加try,避免影响后面的程序运行
[解决办法]
server 端关闭,client端依然在读取数据 所以引发异常
catch(IOException ex)
{
if(IOException.InnerException is System.Net.Sockets.SocketException)


Console.WriteLine("网络中断");
else
Console.WriteLine(ex.Message);
}

[解决办法]
服务器遇到异常已经关闭了。
[解决办法]
是不是重复使用端口了?
[解决办法]

引用:
现为一个小公司做了一个C\S管理程序, 通过Socket 通信,在开发机器上测试时,一切正常(服务器和客户端都在同一台开发主机上)。但是当将服务器端移植到专门的主机上后, 服务器端经常出现该异常。
我已经将客户端发送消息的时候,将发消息所在的线程睡了30秒。 但还是出现这样的问题。


睡30秒?我觉得睡0.1秒都是浪费社会资源。通讯不是这样的,不需要睡。如果有人跟你说你客户端发送太快了所以出错,那么可以肯定是你的服务器端软件设计有基本的概念错误,而不是人家socket有问题。比如说在一些有ARP攻击(比如有人喜欢玩“BT终结者”软件)或者路由器连接有故障的网络上,服务器可能在收到一个buffer数据之后,暂时地缓冲区中没有数据,可是紧接着buffer就又能收到数据了。这时候,你如何判断一个消息结束?如果你没有等待业务上定义的消息结束符号,而仅仅根据buffer中没有数据了就认为客户端发送完了,那么服务器就会提前胡乱解析未完的数据甚至关闭连接了。
[解决办法]
如果不太有把握进行tcp通讯,还是先使用web service或者wcf吧。这两种是比较傻瓜化的,比较可靠。

读书人网 >C#

热点推荐