您的位置:首页 > 编程语言 > Go语言

关于UDP消息服务抛出“远程主机强迫关闭了一个现有的连接”的异常说明及处理方法

2012-02-16 11:55 851 查看
在公司一项目的UDP消息服务开发中时不时的会遇到这样一个问题:在UDP通信过程中,如果客户端中途断开,服务器会收到一个SocketException,错误ID为10054,描述是“远程主机强迫关闭了一个现有的连接”,紧接着的事就可怕了,UDP服务终止监听,所有客户端都受到了影响。也就是说一个客户端引起的异常导致了整个系统的崩溃。这个问题可是太严重了。

地球人都知道,UDP是无连接的,怎么会出现这个异常呢?百度了一圈,发现有这个问题的现象还不少,可就是没有一个有效的回复。再GOOGLE一圈,有点眉目了。找到了一个微软的解释和一个DOTNET的解决方法:

微软的解释:http://support.microsoft.com/kb/263823

DOTNET的处理方法:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1887.aspx

不过处理方法似乎对参数的设置不太正确:

byte[] optionInValue = { Convert.ToByte(true) };

byte[] optionOutValue;

按照这样设置还是会抛出该异常。

首先,根据微软的解释,optionInValue 传入的应该是false,而不是true;

其次,根据微软的解释,optionOutValue应该是一个DWORD值,不应不赋值,或设为null。

根据以上两点,将以上两句改为:

byte[] optionInValue = { Convert.ToByte(false) };

byte[] optionOutValue = new byte[4];

经过测试,模拟500个用户进行登录、收发消息、注销、异常退出、再连接,均没有再抛出该异常。服务表现稳定。

以上是转载的:

其中byte[] optionInValue        表示你发送的那个字符数组

     byte[] optionOutValue    
  表示接收时定义的字节数组  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐