所谓的远程主机强迫关闭一个现有链接,我的理解是:客户端与服务端之中,有一个率先中断了已经建立的SOCKET,从而导致连接的另一端被强行关闭链接------毕竟你连接的另一端已经关闭了,那你还链接个毛啊。
具体问题具体分析。
—————————————————————————————————————————————————————
第二天补充:我的远程主机强迫关闭一个现有链接 问题出现的原因如下:上位机下位机建立连接后,上位机给下位机发送一个数据采集的命令后,下位机直接把连接的端口给复位了,即:下位机关闭了异常连接。
找到问题出现的原因:下位机等待连接的时间,或者是连接上之后等待上位机发送命令的时间稍微一长(比如20秒这个样子),下位机就会自动复位连接端口(用WIRESHARK抓的包)。
解决方案:没解决,只是让用户关闭软件重启一遍算了。毕竟我也搞得不耐烦了------谁还不是大爷咋地?!
—————————————————————————————————————————————————————
以下所讲并未直接解决远程主机强迫关闭一个现有链接的问题,只是阐述了此问题产生原因,以及一个应急补救办法(代价是软件的友好性,,很差)
我所遇到的问题,或者说我的“远程主机强迫关闭一个现有链接”出现的位置是在一个TRY...CATCH()中捕获的,其实对程序整体而言没什么太大影响,所以我的做法是直接将CATCH中捕获的的错误信息注释掉。
其次,我看别的大佬给出的解决办法是在客户端程序执行完后 READYLINE();或者READAYKEY(); 即保持程序不执行完,防止释放SOCKET,这样就不存在SOCKET的两端有一个率先关闭的问题------但这种方法并不适合我的程序。因为我的问题是出现在客户端关闭时,以及下一次打开时。所以READYLINE();是不现实的------我要关闭窗口了还等毛?
但不可否认,对于只是程序执行完就关闭的顺序型程序(且不是程序内部处理问题,只是程序执行完而已),以上方法是可以本质上防止远程主机强迫关闭现有链接问题的出现的。
最后,私自分析一下“远程主机强迫关闭一个现有链接”这种问题出现的原因(或者说是代码中哪里有疏忽会导致此问题):私以为,大部分的疏忽或者说是遗漏都是由于SOKET一端先行关闭(这里以客户端为例),而另一端的程序中还有程序段的运行需要依赖建立的连接,且此程序段正在运行,所以会抛出异常。个人认为最好的办法是在该程序段钱加上判断SOCKET还是否存在的判断。但时间比较紧,且有点懒,不想去查判断SOCKET状态或者连接状态的代码或者如何如何,等啥时候有时间了在查查吧(或者有大佬如果不吝赐教,那就太好了!!!光明正大吃个白食,嘿嘿)。
第二天补充:只是在CATCH里面注释掉是不行的,程序还会报错的,因为前边还是在用CLIENT嘛,所以我直接把提示改成“比比还是把软件关了重启吧之类,,云云”
贴一段我的出错代码,方便大家和我自己理解。
Socket client = obj as Socket;
while (this.IsVisible )
{
byte[] bufferIn = new byte[BytesCounts]; //接收缓存区
try
{
int length = client.Receive(bufferIn);
if (length != 0)
{
lock (myQueue.SyncRoot)
{
myQueue.Enqueue(bufferIn);
}
lock (lenQueue.SyncRoot)
{
lenQueue.Enqueue(length);
}
}
}
catch (Exception eio)
{
// MessageBox.Show(eio.ToString()); //如果在上位机开启且已经于下位机通信的情况下,先关闭下位机,会爆出“远程主机强迫关闭一个现有链接错误”
}
}