gpt4 book ai didi

.net - 点网 : SocketException (111): Connection refused for UDP on Debian

转载 作者:行者123 更新时间:2023-12-04 07:41:27 27 4
gpt4 key购买 nike

我遇到了一个奇怪的问题;我有两个应用程序,一个前端和一个后端。前端使用 UDP 向后端发送消息。我有使用 UDP 的特定原因,但其中之一是我不在乎后端何时因某种原因关闭或无法访问。我只是想让消息丢失。是的,你没看错😉
现在忘记后端。让我们播放后端未启动并且前端无论如何都会向后端发送 UDP 数据包的场景。客户端发送永远不会到达的消息,在 Windows 上就好了。如预期。在 Linux(确切地说是 Debian)上,我得到了一个 SocketException (111): Connection refused .当我将消息发送到(不存在的)远程主机时,不会发生这种情况。但是,只要主机是localhost127.0.0.1甚至 192.168.1.1 (机器的 LAN IP)抛出异常。当主机是8.8.8.8192.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(".");
}
对于上述所有三个脚本,输出为(如预期): .............…等等。
现在是 .Net (C#) 版本(我开始是异步的,但在我的搜索中我什至回到了同步):
C# 同步 :
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 .
我发现唯一可能相关的是 this over at PerlMonks :

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.



Manpage
但是由于我无法设置任何标志,甚至无法设置类似于 SO_BSDCOMPAT 的任何标志。这似乎是一个死胡同(甚至可能不是问题所在)。
有没有人有 任何 关于这里发生了什么的线索?
总结:当没有“后端”(或服务器)监听时,上面的 C# 在 Windows 上运行良好;消息会丢失 - 正如预期的那样。在 Linux (Debian 10) 上,C# 代码抛出异常,但 Python、Perl 和 PHP 似乎工作得很好,排除了操作系统 (恕我直言)。我正在运行 dotnet 5.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 a Socket


...但我使用了 .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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com