【发布时间】:2018-02-04 20:23:33
【问题描述】:
我必须使用 UDP 套接字编写程序,但我无法理解在我遇到的情况下应该做什么。
我有一个服务器和一个客户端。服务器在 INADDR_ANY 套接字上接收数据报,并且对于出现的每个唯一客户端,它会向其发送大量信息。每个客户端还定期向服务器发送数据。
对于每个联系侦听套接字的客户端,我们将其称为 0,我为其创建一个单独的套接字,这样我就可以向它发送数据而不会阻塞套接字 0。我想要做的是将与特定客户端的所有通信移动到新的插座。我可以这样做吗?目标是让通信更轻松、更高效并避免阻塞任何套接字。
所以我未能找到答案的问题是:
- 我可以从该特定客户端接收来自该套接字的数据吗?
- 如果不是,如果我不经常执行 recvfrom,所有客户端都不会写入套接字 0 会阻塞它吗?
- 如果可以在单独的套接字上接收来自特定客户端的数据,该数据是否会同时到达套接字 0 和特定套接字?
我知道 TCP 会更好地解决这个问题,但我必须使用 UDP。我该怎么做?是否有处理此类情况的公认“标准”?
评论:我感觉我误解了 UDP 套接字,但与 TCP 相比,关于它的教程真的很少。
【问题讨论】:
-
确实没有“阻塞套接字 0”这样的东西。如果发送会被阻塞,那么你有多少个套接字都没有关系。 UDP 服务器最好使用单个套接字来实现。
-
@EJP 真的吗?我的意思是套接字的内存量是有限的。如果套接字已满,发送到它的 sendto() 会阻塞,如果非阻塞则失败,对吧?我觉得为每个客户端创建一个 UDP 套接字是合乎逻辑的。我的逻辑有什么问题?
-
与 TCP 套接字不同,UDP 套接字总是以网络接口接受它的速度发送数据。因此,通常您不需要例如两个 UDP 套接字;您可以改为创建一个具有两倍 SO_SNDBUF 缓冲区空间的 UDP 套接字。
-
@m_highlanderish 套接字具有套接字发送和接收缓冲区,您可以控制其大小。
标签: sockets udp client-server