UDP服务器应如何回复其客户端?

时间:2011-08-04 15:11:41

标签: multithreading sockets udp

我需要一个可以与许多客户端通信的UDP服务器。

我目前的想法是

  1. 打开插座
  2. 绑定到端口
  3. 从客户端收回
    • child:处理消息,打开新套接字并发送给客户端
    • parent:转到第3步
  4. 服务器在客户端连接的同一端口上回复客户端,但是从随机端口回复。

    我已经实现了这一点,并且使用我的测试客户端,它可以正常工作。

    但是,真正的客户端是由其他人在其他地方编写的。 (这是一个嵌入式系统)

    他的客户希望从他发送消息的同一个端口收到回复。我似乎可以做到这一点的唯一方法是使用相同的套接字,它确实有效。

    我担心的是,如果多个客户端尝试同时连接,则会导致问题。

    应该怎么做?

2 个答案:

答案 0 :(得分:2)

UDP套接字比TCP套接字简单得多。只需使用sendto(2)使用recvfrom(2)的客户端地址回复同一套接字。无需弄乱这些线程,只需在循环中执行即可。

编辑0:

在你的评论之后详细说明一下 - 当你在UDP套接字上获得数据报时,你没有得到像TCP一样的新套接字描述符,所以你的父级仍然处理所有的输入。现在,您是否计划fork(2) - 一个新进程,然后为每个数据包创建一个新套接字?或者,您是否希望跟踪源地址并将它们映射到子进程并设置从父对象传递到消息的某种消息?我也不愿意。开销太大了。只需内联即可。

然后,如果您的消息速率真的高并且您的处理真的很重 - 请增加服务器套接字接收缓冲区(SO_RCVBUFsetsockopt(2))看看线程化你的服务器将它分成I / O和处理部分,看看无锁排队等等。但最后一部分是一个完全不同的故事。从简单开始。

答案 1 :(得分:0)

无需分叉或创建新套接字即可发送到客户端。您可以而且应该使用单个插槽执行所有操作。