我正在试图理解如何使客户端/服务器自己编写接受多个套接字连接。
连接是一个数据报(UDP),现在基于getaddrinfo(3) man page
实现了很好,但是每个客户端都需要等待处理早期连接的过程。
我听说过select,但在其手册页中说:
select()可以用来解决一个问题 朴素的程序员试图解决的便携和有效的方式 使用线程,分叉,IPC,信号,内存的更复杂的方式 分享,等等。
以及更多:
特定于Linux的epoll(7)API提供了一个接口 更多 监控大量的时候比select(2)和poll(2)高效 文件描述符。
那么,是吗? epoll比选择更好吗?还是取决于?如果取决于什么?
epoll手册页有部分样本,所以我试图理解它。
现在,(在服务器上)我想,我需要一个线程来监听一个线程并写入另一个线程。但是如何控制部分消息的完成?如果两个客户端交错发送部分消息,如何识别? sockaddr?如果这是唯一的需要,我可以在没有游泳池的情况下进行管理,那么为什么要使用epoll?
任何人都可以尝试向我解释,如何制作或在何处了解多连接客户端 - 服务器UDP应用程序?
答案 0 :(得分:1)
我认为这里存在关于UDP的误解。 UDP不是面向连接的协议,这意味着没有像TCP这样的永久连接。 UDP只是绑定到一个地址/端口并等待来自每个人的数据包。在服务器上,每个地址/端口号只有一个套接字监听。收到数据包后,您可以通过数据包的源IP找出谁是发件人,您可以通过此IP回复发件人。
正如我所看到的,不需要poll()o select()绑定到地址/端口并异步接收数据包。也就是说,当收到数据包时,您会收到一条警告异步功能的信号/消息。此功能应该是可重入的,这意味着在接收过程中可以接收另一个信号,并且在访问/修改全局内容(变量/对象)时必须小心。处理传入数据包时,应尽快处理它,或者,如果进程花费的时间过长,最好将数据包保存在数据包假脱机中并在另一个[优先级较低]线程中处理它们。
对于UDP数据包大小,请阅读this问题。
对于UDP分段,请阅读this
对于UDP包头读取this