- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个奇怪的问题;我有两个应用程序,一个前端和一个后端。前端使用 UDP 向后端发送消息。我有使用 UDP 的特定原因,但其中之一是我不在乎后端何时因某种原因关闭或无法访问。我只是想让消息丢失。是的,你没看错😉
现在忘记后端。让我们播放后端未启动并且前端无论如何都会向后端发送 UDP 数据包的场景。客户端发送永远不会到达的消息,在 Windows 上就好了。如预期。在 Linux(确切地说是 Debian)上,我得到了一个 SocketException (111): Connection refused
.当我将消息发送到(不存在的)远程主机时,不会发生这种情况。但是,只要主机是localhost
或 127.0.0.1
甚至 192.168.1.1
(机器的 LAN IP)抛出异常。当主机是8.8.8.8
或 192.168.1.10
(我局域网中的一些随机主机)或 192.168.1.200
(我的 LAN 中不存在的主机)不会引发异常。
因为我觉得我快疯了,所以我用其他语言测试了这个,它们似乎都表现正确(即发送消息(永远不会到达),没有异常(exception))。
这是在同一台 Debian 10 机器上有效的方法:
python :
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
sock.sendto(b"Hello, World!", ("127.0.0.1", 12345))
print(".", end = '')
PHP :
<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$msg = "Hello world!";
$len = strlen($msg);
while (true) {
socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 12345);
echo '.';
}
Perl :
use Socket;
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "socket: $!";
$MSG = "Hello world!";
$endpoint = sockaddr_in(12345, inet_aton("127.0.0.1"));
while(true) {
send(SOCKET, $MSG, 0, $endpoint) == length($MSG) or die "cannot send: $!";
print(".");
}
对于上述所有三个脚本,输出为(如预期):
.............…
等等。
static void Main(string[] args)
{
var data = Encoding.UTF8.GetBytes("Hello world");
var client = new UdpClient("127.0.0.1", 12345);
while (true) {
client.Send(data, data.Length);
Console.Write(".");
}
}
C# 异步 :
static async Task Main(string[] args)
{
var data = Encoding.UTF8.GetBytes("Hello world");
var client = new UdpClient("127.0.0.1", 12345);
while (true) {
await client.SendAsync(data, data.Length).ConfigureAwait(false);
Console.Write(".");
}
}
我什至将代码改写为
不是 使用
UdpClient
但是一个
Socket
;同样的结果。 .Net 不断抛出
SocketException (111): Connection refused
.
Snippet from socket man page SOCKET OPTIONS section for option SO_BSDCOMPAT:
If enabled ICMP errors received for a UDP socket will not be passed to the user program. In later kernel versions, support for this option has been phased out: Linux 2.4 silently ignores it, and Linux 2.6 generates a kernel warning (printk()) if a program uses this option.
但是由于我无法设置任何标志,甚至无法设置类似于SO_BSDCOMPAT
的任何标志。这似乎是一个死胡同(甚至可能不是问题所在)。
有没有人有 任何 关于这里发生了什么的线索?
总结:当没有“后端”(或服务器)监听时,上面的 C# 在 Windows 上运行良好;消息会丢失 - 正如预期的那样。在 Linux (Debian 10) 上,C# 代码抛出异常,但 Python、Perl 和 PHP 似乎工作得很好,排除了操作系统 (恕我直言)。我正在运行 dotnet5.0.202
、Windows 10 和 Debian 10 (Linux myhost 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux)
- 都是最新的。
最佳答案
好吧,你一定是在开玩笑……正如我所说:
I even rewrote the code to not use a
UdpClient
but aSocket
.Send()
和
.SendAsync()
套接字上的方法。我刚刚用
.SendTo()
试过了和
.SendToAsync()
方法,这似乎有效。哪个...有点道理,因为对于
.Send()
和
.SendAsync()
您需要调用的工作方法
.Connect()
首先和为
.SendTo()
/
.SendToAsync()
允许您在
SendTo...
中指定远程端点称自己。
static void Main(string[] args)
{
var data = Encoding.UTF8.GetBytes("Hello world");
var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
var ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
while (true) {
socket.SendTo(data, ep);
Console.Write(".");
}
}
所以这可以/将被标记为已解决。
关于.net - 点网 : SocketException (111): Connection refused for UDP on Debian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67434589/
我正在寻找的服务器是: 轻量级, 非 buggy , 支持.NET, 在客户端上运行以进行测试, 在Windows上运行 Cassinni太过马车,IIS太昂贵,Apache很难安装,XSP仅是lin
所以我有大约10个短的css文件,可以与mvc应用程序一起使用。 有像 error.css login.css 等等... 仅有一些非常短的CSS文件,这些文件使更新和编辑变得容易(至少对我而言)。我
我正在编写程序来自动化 win32 表单。我正在使用 Microsoft UI 自动化库。我不知道如何获取和调用该表单上的预定义快捷键。现在我只需获取 MenuItem 的 AutomationEle
我有一个在后台线程上运行的及时操作。运行时,我当前将光标置于等待状态: Mouse.OverrideCursor = Cursors.Wait 我刚刚实现了一项功能,允许用户在厌倦等待时单击“取消”按
如何找到所有可能直接或间接调用给定方法的单元测试?当我更改方法时,我希望知道要运行的最佳测试;必须有一个工具! 因为我们有很多接口(interface),所以我对所有调用接口(interface)方法
我想知道,一个类会被装箱吗?我一直假设每个类都有一个虚拟表,可以用来标识类,所以它需要装箱吗? 最佳答案 只有值类型(结构)被装箱。类实例不会被装箱。 关于.net - 类是盒装的吗? 。网,我们在S
所以接下来有一个按钮调用(页面)。它的 href 链接是 site/blah/#。所以我知道它真正运行的 javascript 代码。在我解析完第一页后,我想解析下一页。我如何模拟鼠标点击,以便我可以
我想知道是否有人对解决以下设计问题有好的建议/模式。我有一个命令类的层次结构。在最抽象的层面上,我有一个 ICommand 接口(interface)。执行 ICommand 的 RunCommand
我在资源(xsd 文件)中有几个文件可用于验证收到的 xml 消息。我使用的资源文件名为 AppResources.resx,它包含一个名为 clientModels.xsd 的文件。当我尝试使用这样
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
(最后的简短版本) 我目前正在开发的软件需要跟踪任意数量的 MS Office 文件,现在需要提供将所有这些文件一起打印的功能,以及一些应用程序数据(可能会发送到打印机作为 .xps、.html 或
我想在不指定命名空间或程序集的情况下按名称(字符串)实例化一个类。像这样(Unity 语法): var processor = container.Resolve("SpecialProcessor"
我有一些代码可以对 64 位整数进行大量比较,但是它必须考虑数字的长度,就好像它被格式化为字符串一样。我无法更改调用代码,只能更改函数。 最简单的方法(除了 .ToString().Length 之外
使用遗留代码,我发现我有很多这样的语句(超过 500 个) bool isAEqualsB = (a == b) ? true : false; 这样重写有意义吗? bool isAEqualsB =
我有这个: AudioPlayer player = new AudioPlayer(); player.Directory = vc.Directory; player.StartTime = vc
我已经阅读了很多关于双重检查锁定的危险的文章,我会努力远离它,但话虽如此,我认为他们的阅读非常有趣。 我正在阅读 Joe Duffy 的这篇关于使用双重检查锁定实现单例的文章: http://www.
对于可变类型,值类型和引用类型之间的行为差异很明显: // Mutable value type PointMutStruct pms1 = new PointMutStruct(1, 2); P
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this q
我有一个 Cordova pp 我在 Controller 中调用post方法 它可以在浏览器中工作,但是在构建和调试apk时出现错误 ionic.bundle.js:23826 POST http:
我们正在尝试将时间戳附加到某些 URL 以让内容缓存但在它们发生更改时更新它们。我们有代码可以归结为: DateTime ts = File.GetLastWriteTime(absPath); 其中
我是一名优秀的程序员,十分优秀!