1

我正在打破我的想法,试图了解如何让我自己编写的客户端/服务器接受多个套接字连接。

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

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

select() 可用于以可移植且有效的方式解决许多问题,天真的程序员试图使用线程、分叉、IPC、信号、内存共享等以更复杂的方式解决这些问题。

和更多:

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

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

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

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

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

4

1 回答 1

5

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

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

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

对于 UDP 分片,请阅读

对于 UDP 数据包标头,请阅读

于 2013-07-22T09:46:13.063 回答