【问题标题】:socket control to accept multiple UDP connections接受多个 UDP 连接的套接字控制
【发布时间】:2013-07-22 02:52:35
【问题描述】:

我想了解如何让自己编写的客户端/服务器接受多个套接字连接。

连接是数据报(UDP),目前是基于getaddrinfo(3) man page实现的,效果不错,但是每个客户端都需要等待早期连接的处理过程。

我听说过 select,但在其手册页中说:

select() 可以用来解决很多问题 天真的程序员试图解决的可移植且高效的方法 使用线程、分叉、IPC、信号、内存的更复杂的方式 分享等等。

还有更多:

Linux 特定的 epoll(7) API 提供了一个接口 更多的 在监控大量数据时比 select(2) 和 poll(2) 更有效 文件描述符。

那么,是吗? epoll 简直比 select 好?还是视情况而定?如果取决于,取决于什么?

epoll 手册页有部分示例,所以我试图理解它。

现在,(在服务器上)我想,我需要一个线程来监听一个线程并写入另一个线程。但是如何控制部分消息的完成呢?如果两个客户端交错发送部分消息,如何识别?通过 sockaddr?如果它是唯一需要,我可以在没有池的情况下管理它,那么为什么要使用 epoll?

谁能尝试向我解释一下,如何制作,或者在哪里了解多连接客户端-服务器 UDP 应用程序?

【问题讨论】:

  • 1.是的,epollselect 好。 2.看书Unix Network Programming
  • 我会阅读它,感谢您的回复...如果您将您的评论推广到回复,我会投票。
  • 没有“接受[ing]多个UDP连接”之类的东西。只能从一个或多个远程源读取 UDP 数据报。

标签: c sockets epoll getaddrinfo


【解决方案1】:

我认为这里对 UDP 存在误解。 UDP不是面向连接的协议,这意味着没有像TCP这样的永久连接。 UDP 只是绑定到一个地址/端口并等待来自每个人的数据包。在服务器上,每个地址/端口号只有一个套接字侦听。当收到一个数据包时,您可以通过数据包的源 IP 找出谁是发送者,您可以通过这个 IP 回复发送者。

在我看来,不需要 poll() o select() 绑定到地址/端口并异步接收数据包。也就是说,当收到一个数据包时,您会收到一个信号/消息,提醒您的异步函数。这个函数应该是可重入的,这意味着在接收过程中可以接收到另一个信号,并且在访问/修改全局内容(变量/对象)时必须小心。在处理传入的数据包时,应该尽快处理它,或者,如果处理时间过长,您最好将数据包保存在数据包假脱机中,并在另一个[优先级较低的]线程中处理它们。

对于 UDP 数据包大小,请阅读 this 问题。

对于 UDP 分片读取this

对于UDP数据包头读取this

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2021-09-13
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多