c++ - UDP recv/recv 来自多个发件人

标签 c++ udp recv

美好的一天,

我正在用 VC++ 开发一个应用程序,它使用 UDP 协议(protocol)与 Windows XP 上的 winsock 进行通信。以前我已经能够假设该工具接收到的所有数据包都来自一个目标。但是我现在正在接收广播。监听线程的开销很小,应该将所有时间都花在下面这行上:

rv = recvfrom(socket, 
              p_buffer_p, 
              p_size,
              0,
              (sockaddr*)&clientService_in, //This is set to do a broadcast recv
              &SenderAddrSize);

我的问题是我是否可以假设从 recvfrom 的单个返回中获得的缓冲区来自单个目标。也就是说,发送应用程序中发送的 1 次调用是否等于接收应用程序中 recvfrom 的 1 次返回?或者可以将来自多个发件人的多个发送合并为 1 个吗?

我假设来自目标的单个发送不能从 recvfrom 拆分为多个返回。我一直都这么认为,而且从来没有遇到过问题。

还有一件事,它是一种 SOCK_DGRAM 类型的套接字。

最佳答案

不可以,UDP 消息不能拆分。他们被发送时到达。此外,不会串联多个 UDP 消息。

所以N个sendto消息对应N个recvfrom调用。

引自 wiki :

Datagrams – Packets are sent individually and are checked for integrity only if they arrive. Packets have definite boundaries which are honored upon receipt, meaning a read operation at the receiver socket will yield an entire message as it was originally sent.

关于c++ - UDP recv/recv 来自多个发件人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8748711/

相关文章:

go - 在 GO 中获取传入的 TTL

c - 如何使用 epoll 管理从多个客户端接收多个缓冲区?

c - 从Java-Client接收数据(数据包含int、short、string)

c++ - std::map 的线程安全使用

sockets - UDP套接字会过期吗?

c++ - 在 C++ 中销毁动态分配的内存(数组对象)

C#发送视频帧

php - Nginx 错误 recv() 失败 (104 : Connection reset by peer)

c++ - Gtk 进度条高度

c++ - Boost.Test : Looking for a working non-Trivial Test Suite Example/Tutorial