【发布时间】:2019-11-01 14:03:51
【问题描述】:
我有一个适用于 Udp 的套接字程序。
我想管理连接到服务器的客户端。
例如,如果客户端连接到服务器,则将该客户端添加到列表中。 我已经使用以下代码在 Tcp 中完成了此操作:
static readonly Dictionary <int, TcpClient> list_clients = new Dictionary <int, TcpClient>();
例如,只有在列表中的客户,他的消息才会被写入。
我将每个客户与GetStream() 进行了比较。但在 Udp 中我不知道该怎么做。我可以管理客户吗?
编辑
我使用以下代码接收来自客户端的消息:
private static UdpClient udpServer = new UdpClient(11000);
private static IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 11000);
static void Main(string[] args)
{
var firstData = udpServer.Receive(ref remoteEP);
Console.WriteLine(Encoding.ASCII.GetString(firtsData);
}
提前致谢
【问题讨论】:
-
UDP 是无连接的。您当然可以保留客户端列表,但您必须手动跟踪哪些客户端正在主动发送消息,以及哪些客户端在 X 时间内没有发送任何消息(和/或收到回复),以便您可以将它们从列表。
-
客户有哪些具体特点可以相互区分?在 Tcp 中,它们的流不同,可以通过 GetStream 获得。 @remy-lebeau
-
由于UDP中没有流,可以通过远程
IPEndPoint来区分。否则,让您的 UDP 消息在其有效负载数据中携带客户标识,例如用户 ID、唯一会话 cookie 等。 -
(remote IP: port) 对我来说在 UDP 中总是一样的。我之前唯一想到的,你也提到过,就是在消息中放一个 id 或一定数量。
-
"
remoteEP数据总是不同的吗?" - 如果您有多个客户端发送到您的服务器,那么可以。它代表刚刚读取的当前数据包的远程端点。因此,如果您一次从多个客户端获取数据包,remoteEP将根据需要在它们之间切换
标签: c# .net sockets udp client