multithreading - UDP 服务器应该如何回复它的客户端?

标签 multithreading sockets udp

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

我目前的想法是

  1. 打开一个套接字
  2. 绑定(bind)到端口
  3. 从客户那里获得
  4. fork
    • child:处理消息,打开一个新的socket并发送给客户端
    • 家长:转到第 3 步

服务器在客户端连接的同一端口上回复客户端,但从一个随机端口。

我已经实现了这个,并且在我的测试客户端上,它有效。

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

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

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

应该怎么做?

最佳答案

UDP 套接字比 TCP 套接字简单得多。只需在与 sendto(2) 相同的套接字上回复使用您从 recvfrom(2) 获得的客户地址.无需打乱这些线程,只需循环执行即可。

编辑0:

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

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

关于multithreading - UDP 服务器应该如何回复它的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943911/

相关文章:

java - 使用Swing和Java, "Swing-Shell"线程做了什么

c - 将 http 表单值传递给 C 程序

.net - 图形 GDI+ 上的多线程

python - 设置 Python Pub/Sub 异步拉取订阅者线程数

c++ - UDP如何在同一端口上发送和接收?

c# - Socket 接收数据时处理未知字节大小

java - Java socket编程中如何实现客户端到服务器的持续交互

c# - UDP - 发送多播消息并监听响应给出 SocketException

c++ - 如何接收来自已订阅组的组播数据包?

objective-c - 可能的? NSThread 通过单例 Objective-C iOS 请求 URL