发送有关 C 和 C++ 中的 UDP 套接字的信息

send about UDP socket in C and C++

本文关键字:UDP 中的 套接字 信息 C++      更新时间:2023-10-16
  1. 一个叫"connect"的非块UDP套接字,用"发送"发送数据,是不是有必要用"select/epoll/kqueue"来测试它是否可写?在这种情况下,另一侧 recv 缓冲区已满,"发送"可能会失败,所以我可以使用"选择"来测试它是可写的,以便"发送"可能会返回成功?或者这是不必要的,因为它只是将数据发送出去,并不关心一方的recv增益是否满?如果真是这样,"送"可能只会返回成功,除非对方倒下?
  2. 对于UDP套接字,"send"的返回值是什么,例如,我发送100个字节,它可能只返回-1(错误(或100,没有其他值?对于TCP可能返回50~~~~

在这种情况下,另一侧 recv 缓冲区已满,"发送"可能会失败,所以 可以使用"选择"来测试它是可写的,以便"发送"可以返回 成功?

您正在使用 UDP。 数据包被发送,如果接收端的接收缓冲区已满,接收系统将丢弃它。 阅读此内容: https://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions

send()调用的结果将完全独立于接收方的状态。 即使接收端不存在,它也会返回成功。

有关 UDP 如何处理大于底层网络数据包大小的数据报,请参阅以下内容: Linux 上的 UDP 套接字;发送成功但无法接收大型缓冲区

通常,send() 不会阻塞,并且始终返回写入的字节数,除非内核中的本地(发送(缓冲区已满。对于基本上永远不会发生的UDP套接字。对于TCP套接字,如果您写入速度快于链路或接收端可以处理的速度,就会发生这种情况。