udp 远程主机强迫关闭了一个现有的连接
开启一个线程作端口监控,循环接受数据,用另外几个线程处理业务逻辑并使用监控的那个socket发送回复数据出去,总不断的遇到udp 远程主机强迫关闭了一个现有的连接这种错误。
UDP不是连接型的,怎么会出这个错误,郁闷阿,何解?

解决方案 »

  1.   

    就是在初始化的时候创建一个UDP socket
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    绑定到本地8000端口
    然后创建一个线程循环接收来自8000端口的UDP包(并做组包处理),将完整的包放出处理队列。
    再创建4个处理线程循环从处理队列中获取需要处理的UDP包,并将回复直接通过上面的socket的SendTo发送出去。
    结果经常在循环接收的线程中出现10054错误,很郁闷,搞了好几天就是解决不了,是不是微软的Bug?
      

  2.   

    更正上面的错误:循环接收来自8000端口的UDP包(并做组包处理),将完整的包放入处理队列
      

  3.   

    10054 BUG: Winsock 控件运行时错误 - 用于 UDP DataArrival 事件中
    察看本文应用于的产品
    注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
    文章编号 : 260018 
    最后修改 : 2007年2月12日 
    修订 : 3.1 
    本页症状原因解决方案状态更多信息重现行为步骤参考
    症状
    当您使用基于 Windows 2000 的计算机上网络通信与 Winsock 控件, 使用用户数据报协议 (UDP), 发生运行时错误并作为 sckUDPProtocol 设置控件的 协议 属性。 如果 A0 > SendData < / A0 > 请求发送到 RemoteHost, 未侦听 RemotePort, 可 DataArrival 事件激发并指出该 1 字节的数据。 当调用 GetData 方法来检索该数据, 发生以下 MicrosoftVisualBasic 运行时错误: 
    重 ' 10054 ' - " 通过远程端置连接 "。 
    通过使用 Error 事件的 Winsock 控件通常, 您可以捕获错误。 但是, 甚至 Error 事件是否存在对控件, 时从不引发 Error 事件并运行时错误消息框显示。 
    回到顶端原因
    UDP 数据包发送到远程计算机和该计算机未侦听指定, 端口时 Internet 控制消息协议 (ICMP) 报告此为端口无法到达 ICMP 错误, 它然后转换到 Windows 2000 Winsock 控件作为 10054 错误。 Winsock 控件正确处理错误, 导致它传递到 VisualBasic 运行时错误随后捕获和显示。 
    回到顶端解决方案
    要变通解决此问题, 使用 Microsoft Visual Basic Standard 错误处理机制来捕获错误。 以下代码片段示此变通办法: Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
       Dim szData As String   On Error Resume Next
       Winsock1.GetData szData
       If Err Then 
          ' handle the error here
       End if
    End Sub

    使用 OnError 方法周围的 Winsock 控件 GetData 方法来捕获错误。 
    回到顶端状态
    Microsoft 已确认这是 " 适用于 " 一节中列出的 Microsoft 产品中错误。
    回到顶端更多信息
    重现行为步骤
    1. 创建新项目。 
    2. 向项目添加 Winsock 控件。 
    3. 将窗体上 Winsock 控件。 
    4. 在窗体的 Load 事件添加以下代码:Private Sub Form_Load()
      Winsock1.Protocol = sckUDPProtocol
      Winsock1.RemoteHost = "localhost"
      Winsock1.RemotePort = 8377 ' pick port that is not listening
      Winsock1.SendData "Hello World!"
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
      Dim szData As String
      Winsock1.GetData szData       ' error occurs here.
    End SubPrivate Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
      CancelDisplay = True
      MsgBox "Error"
    End Sub

     
    如果基于 Windows 2000 的计算机, 上运行此代码 Winsock1_Error 处理程序从不称为即使 Winsock 控制出现错误。 VisualBasic 错误处理程序就能够捕获并处理错误如果使用解决 " 解决办法 " 部分中描述。 注意 : 不会发生运行时错误: 如果基于基于 MicrosoftWindowsNT 或基于 Microsoft Windows 98 的计算机上运行相同的代码。 
    回到顶端参考
    有关详细信息, 请单击下列文章编号, 查看 Microsoft 知识库文章中文章: 
    245442 (http://support.microsoft.com/kb/245442/) Winsock 忽略 ICMP 端口无法访问控制消息 
    244751 (http://support.microsoft.com/kb/244751/) 在所有情况 Winsock 控件不触发错误事件 
    263823 (http://support.microsoft.com/kb/263823/) WinSock Recvfrom() 现在返回 WSAECONNRESET 而不是阻止或超时 
    回到顶端
      

  4.   

    http://support.microsoft.com/kb/260018/zh-cn
    会不会跟这个有关系,但这是windows 2000的ICMP Bug,我用的操作系统是Windows 2003
      

  5.   

    如果幅略错误就会造成CPU资源上升的很厉害,有解不?
      

  6.   

    搜索了很久,终于搞定了。uint IOC_IN = 0x80000000;
    uint IOC_VENDOR = 0x18000000;
    uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;socket.IOControl((int)SIO_UDP_CONNRESET, new byte[] {Convert.ToByte(false)}, null);