m_h*_*ish 1 sockets udp client-server
我必须使用 UDP 套接字编写一个程序,但我无法理解在我遇到的情况下应该做什么。
我有一个服务器和一个客户端。服务器在 INADDR_ANY 套接字上接收数据报,并且对于出现的每个唯一客户端,它将向()发送大量信息。每个客户端还定期向服务器发送数据。
对于联系侦听套接字的每个客户端,我们将其称为 0,我为其创建一个单独的套接字,这样我就可以向它发送数据而不会阻塞套接字 0。我想要做的是将与特定客户端的所有通信移动到新套接字. 我可以这样做吗?目标是使通信更容易、更高效并避免阻塞任何套接字。
所以我未能找到答案的问题是:
我知道 TCP 会为此工作得更好,但我必须使用 UDP。我该怎么做?是否有处理此类情况的公认“标准”?
评论:我有一种感觉,我误解了 UDP 套接字,但与 TCP 相比,关于它的教程真的很少。
我想要做的是将与特定客户端的所有通信移动到新套接字。我可以这样做吗?
您可以创建一个新的 UDP 套接字,将其 bind() 到不同的端口,然后指示客户端开始向新套接字的端口而不是通常的端口发送流量;但请注意,这样做并没有真正获得任何优势。
如果没有,如果我不经常执行 recvfrom,所有客户端写入套接字 0 是否会阻塞它?
是的,但通常的解决方案是经常调用 recvfrom() 以跟上传入流量的流,和/或增加其 SO_RECVBUF 缓冲区大小以使其传入数据缓冲区足够大,以至于不太可能变满. 确保 recvfrom() 被足够频繁调用的一种方法是创建一个单独的线程,该线程除了在循环中调用 recvfrom() 之外什么都不做,然后将数据传递给另一个线程进行更密集的处理。如果可能,请以更高的优先级运行此网络线程,以确保它不会被其他线程阻止 CPU。
如果可以在单独的套接字上从特定客户端接收数据,该数据是否会同时到达套接字 0 和特定套接字?
如果您有两个线程都在同一个套接字上调用 recvfrom(),那么任何给定的传入 UDP 数据包都将被传递到一个线程或另一个线程,并且无法预测哪个线程将接收哪个数据包——这只是运气绘制取决于特定线程对其调用 recvfrom() 时套接字传入缓冲区中的下一个数据包是什么。通常,不推荐使用多个线程访问单个套接字。
我知道 TCP 会为此工作得更好,但我必须使用 UDP。我该怎么做?是否有处理此类情况的公认“标准”?
我不知道什么是“标准”,但我通常有一个专用的 I/O 线程,它只从 UDP 套接字读取(如果需要,写入)。它将 UDP 套接字设置为非阻塞模式,然后围绕 select() 循环到 recvfrom() 任何传入的 UDP 数据包,并(以线程安全的方式)将传入数据包的数据及其源地址/端口信息附加到FIFO 队列供其他(对时间不敏感)线程取出并稍后处理。这样,即使数据包(或系列或数据包)需要相对较长的时间来处理,结果也不会是数据包被丢弃(尽管随着 FIFO 变大,它可能会暂时增加 RAM 使用量)
| 归档时间: |
|
| 查看次数: |
5348 次 |
| 最近记录: |