设计UDP服务器的最佳方法是什么?

时间:2017-04-05 06:55:38

标签: linux sockets server udp

假设有一个服务器处理多个客户端。 世界上有6个客户。

我认为设计此服务器有3种方法

  1. 整个接收任务的一个套接字,整个发送任务的另一个套接字。

  2. 整个接收任务的一个套接字,为与6个客户关联的每个世界分配发送套接字。

  3. 为每个世界接收套接字,为每个世界发送套接字

  4. 哪个最好? (当然。可以有其他方法)

    抱歉我的英文不好:)

2 个答案:

答案 0 :(得分:0)

您可以在同一个套接字上接收/发送。

查看UDP multi client server basics

我不知道应用程序或您尝试做什么但是:

3)它需要客户端发送到不同的端口,因为每个端口只能监听1个套接字

2)为什么要分配一个新套接字,只需使用与udp相同的套接字就可以使用sendto

1)与上述相同

答案 1 :(得分:0)

我知道这不能完全回答您的问题,但是因为它与性能有关,所以我想提供自己的意见。

如果要提高性能,您必须考虑1个线程只能如此快地沿管道移动信息,并且您的服务器很可能是多核的,那么为什么不使用所有内容呢?

UDP发送应该在一个线程上。它的工作是在队列样式的容器(先进先出)中循环。它应该接收一个构造好的数据包并将其发送,仅此而已。为了防止浪费循环时间,您可以使用Sleep(1)(它也很浪费(实际上不仅仅睡眠1ms)),或者实现线程信号传输(通常会提高性能)。

在另一个线程(可能是主线程)中,数据包是通过OpCode组装流水线用数据(无论是否加密)构造的,并放置在队列中,一旦计划好,UDP Send线程就会将其提取。

与UDP接收相同,单独的线程,基于套接字状态或Sleep(1)的信令。将数据包传递到OpCode Stripping Line。

与客户端的整个UDP通信只需要1个套接字即可。

我将套接字写为非阻塞。阻塞套接字可以用于登录服务器(如果是单独的服务器或修补程序服务器),因为它们的唯一作用就是接受套接字连接。

希望这会有所帮助。