【问题标题】:UDP ReceiveAsync breaks for all clients所有客户端的 UDP ReceiveAsync 中断
【发布时间】:2022-02-19 00:49:02
【问题描述】:

我创建了一个简单的 C# UDP 服务器/客户端模型,其中多个客户端可以连接到同一个服务器。它们都使用相同的 EndPoint 连接到:IPEndPoint(IPAddress.Any, 0); 发生这种情况时,我会生成一个新任务,该任务使用

侦听给定 remoteEndPoint 上的传入消息

SocketReceiveFromResult dataReceived = await socket.ReceiveFromAsync(buffer, SocketFlags.None, endpoint).RemoteEndPoint;

这很有效,新连接可以连接并开始向服务器发送消息,然后服务器将这些消息中继到其他客户端。 然后当我关闭其中一个客户端连接时,我关闭()来自该客户端的套接字,但随后我在 ReceiveLoop 任务中得到一个 SocketException,显示“现有连接被远程主机强行关闭”。这根本不是问题,但所有连接都会发生这种情况,甚至是侦听传入请求的初始端口。

 try
 {
     if (isConnected)
     {
         UdpProtocol.RequestFromData requestFromData = await socket.ReceiveFromAsync(buffer, SocketFlags.None, endpoint);
         onMessageReceived?.Invoke(requestFromData.JsonObject);
      }
 }
 catch (SocketException exception)
 {
     onConnectionClosed?.Invoke();
 }

如何正确终止连接而不导致所有其他客户端连接也终止?

【问题讨论】:

  • “所有 udp 连接中断” - UDP 中没有连接。
  • 不是这样,但是客户端和服务器仍然必须绑定到同一个端点。也许我的语义是不正确的,但我认为上面描述的过程仍然是一个连接,即使在传输层它不是
  • "当我关闭其中一个客户端连接时..." 这是在服务器还是客户端应用程序中?另外,显示相关代码。
  • 如何以及何时创建socket?显示相关代码。

标签: c# sockets udp


【解决方案1】:

找了好久,终于找到了这个帖子: C# UDP An existing connection was forcibly closed by the remote host

显然,UDP套接字监听“ICMP消息并在收到时抛出异常。如果端口不再监听(硬崩溃后),ICMP消息会导致'强制关闭'异常。”

此代码用于创建不侦听此类事件的套接字。

        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        const int SIO_UDP_CONNRESET = -1744830452;
        socket.IOControl((IOControlCode)SIO_UDP_CONNRESET, new byte[] { 0, 0, 0, 0 }, null);
        socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
        IPEndPoint server = new IPEndPoint(IPAddress.Any, 30000);
        socket.Bind(server);

将其放在这里仅供将来参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多