0

我开发了一个 udp 应用程序,其中单个服务器能够处理“x”个客户端。在我的服务器内部,有一个主线程不断地从客户端接收请求/数据,并将每个客户端的信息保存在一个列表中。

一旦请求来自新客户端(即来自其信息未保存在列表中的客户端),就会启动一个新线程并创建一个单独的套接字来为该特定客户端提供服务。换句话说,对于每个客户端,都有一个单独的套接字和一个单独的专用线程。

现在,我预见的问题是,由于只有一个套接字,即单线通信,如果服务器和客户端同时发送数据,就有可能发生数据冲突。

我该如何应对这种情况?等待答复 :(

在此处输入图像描述

4

1 回答 1

2

当您使用 TCP 或 IP 通过 IP 发送消息时,端点会跟踪所谓的 5 元组:源 IP、目标 IP、源端口、目标端口和协议(在本例中为 udp)。

如果您在AB之间发送消息,则来自A的消息将具有 A 的源 IP,来自B的B的目的地将相反。通过这种方式,可以区分数据包来自哪个方向,并使数据包在网络中交叉。包这个词很重要。

UDP 消息不像经典的 POTS 电话对话,在这种情况下,双方有效地在他们之间有一条线路,全部供他们使用。UDP 消息更像蜗牛邮件中的字母,其中每个字母称为一个数据包。它们可以在网络上交叉路径,这很好。

网络堆栈在AB使用 5 元组来确定哪个用户空间套接字应该接收数据,不会混淆某些数据应该去哪个目的地。如果您确实必须等待,您的连接速度将非常低,并且完整的往返可能需要至少 10 毫秒的时间,并且一个数据包几乎总是小于 2k。

于 2013-04-30T12:19:20.053 回答