【发布时间】: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?显示相关代码。