(经过反复研究,下述情况的原因终于搞清楚了,是"ICMP port unreachable"的问题,即:若向一个没有相应UDP监听端口的本机地址(比如127.0.0.1)发送UDP数据包,会回复ICMP port unreachable包,而这个包会被C#的UDP Socket ReceiveFrom函数得到,并报错为“远程主机强迫关闭了一个现有连接”!)

(而为什么向存在的另一个ip(另一台主机)发送不会报错?因为防火墙!win10的防火墙把外部回复的ICMP port unreachable给屏蔽掉了。经实验,把防火墙关掉后,就会出现上述报错了。)

(而为什么向一个不存在的ip地址发送不会报错?因为主机不存在,所以不会回复ICMP port unreachable)

详见:c# - An existing connection was forcibly closed by the remote host - Stack Overflowhttps://stackoverflow.com/questions/7201862/an-existing-connection-was-forcibly-closed-by-the-remote-host

具体描述:

Microsoft Article 263823 said this on the subject: [hard to find as of 2019]

SYMPTOMS In Windows 2000, a User Datagram Protocol (UDP) program may not work and may generate a WSAECONNRESET response.

CAUSE If sending a datagram using the sendto function results in an "ICMP port unreachable" response and the select function is set for readfds, the program returns 1 and the subsequent call to the recvfrom function does not work with a WSAECONNRESET (10054) error response. In Microsoft Windows NT 4.0, this situation causes the select function to block or time out.

RESOLUTION A new sockets IOCTL called "SIO_UDP_CONNRESET" has been introduced in Windows 2000. When this IOCTL is used, the program must be rewritten specifically for Windows 2000 to obtain the original Windows NT 4.0 behavior. Windows NT 4.0, Microsoft Windows 95, and Microsoft Windows 98 have no support for this new IOCTL. In addition to rewriting your application, you will need the hotfix referenced further down in this article.

解决方法:

在创建的socket上配置以下参数:

//配置socket参数,避免ICMP包导致的异常
uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
ServerSocket.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);

以下为原文

——————————————————————————————————————

原以为UDP就是往一个端口上扔数据,对方接收就行了,但经测试,发现没那么简单。肯定是我对UDP的理解不深刻……

前提:

程序A,绑定192.168.100.1(本机地址)的8000端口,向192.168.100.1(本机地址)的9000端口发消息。

程序B,绑定192.168.100.1的9000端口,向192.168.100.1的8000端口发消息。

情况1:

A和B均开始运行,可以互相发送消息(多线程或者单线程),运行正常!符合预期!

情况2:

A运行,但B不运行,则A在ReceiveFrom函数处会报错误:远程主机强迫关闭了一个现有的连接为什么?B不运行,A收不到数据不应该阻塞么?为什么会报错?

情况3:

继续测试:A运行,B不运行,但A改为向192.168.100.2(地址并不存在)的9000端口发送消息,则在ReceiveFrom函数处阻塞。符合预期!为什么?和情况2有什么本质不同么?

情况4:

A和B均开始运行,但B的绑定地址由192.168.100.1:9000,改为了127.0.0.1:9000。结果A和B均在ReceiveFrom函数处报错误:远程主机强迫关闭了一个现有的连接为什么?不都是本机地址么?

我要去看UDP的基础知识去了。

当然也可以就这么小心的用着,别掉坑里就行,但是为什么???哪位大佬给点提示???

C# UDP Socket ReceiveFrom 远程主机强迫关闭了一个现有的连接。相关推荐

  1. UDP 错误 10054 : 远程主机强迫关闭了一个现有的连接

    在公司一项目的UDP消息服务开发中时不时的会遇到这样一个问题:在UDP通信过程中,如果客户端中途断开,服务器会收到一个SocketException,错误ID为10054,描述是"远程主机强 ...

  2. python 网络编程 socket 报错 ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

    服务端: # -*- coding: utf-8 -*- """ @File : 191226_基于UDP协议的socket_server端.py @Time : 201 ...

  3. C#中UDP通信过程中出现:远程主机强迫关闭了一个现有的连接0x80004005】的解决方法

    在UDP通信过程中, 使用try...catch语句接受数据时,总是会出现一个错误: System.Net.Sockets.SocketException (0x80004005): 远程主机强迫关闭 ...

  4. python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

    目录 1 socket的使用 1.1 TCP方法 1.2 UDP方法 2 局域网内连接 2.1 总结 1 socket的使用 1.1 TCP方法 在socket中使用socket.socket建立会话 ...

  5. C#编程UDP通信过程中出现【远程主机强迫关闭了一个现有的连接0x80004005】的解决方法

    一直郁闷 UDP不是面向非连接的?? 在UDP通信过程中, 使用try...catch语句接受数据时,总是会出现一个错误: System.Net.Sockets.SocketException (0x ...

  6. python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。问题解决方案

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  7. 远程主机关闭了一个现有连接python_python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054 | 学步园...

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  8. python远程主机强迫关闭了_[转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054...

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  9. Netty报错 远程主机强迫关闭了一个现有的连接 异常

    百度百科的描述 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...

  10. mysql远程主机强迫关闭了一个现有连接_asp.net连接mysql出现了远程主机强迫关闭了一个现有的连接。!!!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [SocketException (0x2746): 远程主机强迫关闭了一个现有的连接.] System.Net.Sockets.Socket.Recei ...

最新文章

  1. Centos6.4 + PHP5.5.11 + Mysql5.6.16 + Tnginx2.02 + Memcached1.4.17 + Redis2.2
  2. alu是计算机中的什么东西,ALU,什么是ALU,ALU介绍--电子百科词库--科通芯城,IC及其他电子元器件交易型电商平台100%正品保证...
  3. Mac解决终端显示乱码
  4. Java volatile关键字原理解剖
  5. (转)前置++和后置++的区别
  6. python两个中文队列比较_具有两个优先级的优先级队列Python
  7. log4j记录不同的日志_Spring boot中使用log4j记录日志
  8. python调用opencv代码_Python调用OpenCV实现图像平滑代码实例
  9. 怎么设置html编译报错,doctype html编译出错,提示unexpected character D,这是怎么回事呀?...
  10. Java Arrays.sort()函数
  11. 基于jmeter测试web接口,看完都说学会了
  12. linux服务器知识学习:linux简介与linux的发行版
  13. openlayers 加载高德底图
  14. oracle索引用不了,oracle使用索引与不使用索引的性能详析
  15. 佳能G1810G2810G1800G2800G3800 废墨 手动清零方法
  16. Java Web开发流程
  17. 微信APP支付-Android+springboot搭建后端(一)
  18. SNMP(简单网络管理协议)详解
  19. git命令之git fetch的用法
  20. 还没有表白神器?情人节来喽,快为心爱的她送上一份专属的礼物吧~

热门文章

  1. spec.ports[0].name: Required value
  2. sun.net.ftp.FtpClient 中文API
  3. 安卓第三方支付之微信支付
  4. PHP支付宝支付开发流程
  5. 《STL源码剖析》--memery
  6. LoadRunner报错vuser_init.c(18): Error: nca_connect_server: cannot communicate
  7. Notion、印象笔记、Roam research…不知道笔记系统构建方式!怎么能选到对的笔记应用?
  8. 【11】processing-曲线(中文)
  9. 【转】web.xml不同版本的头
  10. np.take()函数用法 python numpy