【问题标题】:send about UDP socket in C and C++在 C 和 C++ 中发送有关 UDP 套接字的信息
【发布时间】:2017-09-06 15:31:58
【问题描述】:
  1. 一个叫connect的非阻塞UDP socket,使用send发送数据,是否需要使用select/epoll/kqueue来测试是否可写?在这种情况下,对方recv缓冲区已满,“发送”可能会失败,所以我可以使用“选择”测试它是否可写,以便“发送”可能返回成功? 或者那是不必要的,因为它只是将数据发送出去,并不关心侧面的recv buff是否已满?如果是这样,“发送”可能只会返回成功,除非对方宕机?
  2. 对于UDP socket,“send”的返回值是多少,比如我发送100字节,它可能只返回-1(error)或者100,没有其他值?对于 TCP 可能会返回 50 ~~~~

【问题讨论】:

  • UDP 是无连接的 - 发送者不知道数据包是否到达接收者,更不用说他们是否接受它或缓冲区是否已满。

标签: c++ c sockets unix


【解决方案1】:

如果对方recv缓冲区满了,“send”可能会失败,所以我 可以使用“select”来测试它是否可写,以便“send”可以返回 成功了吗?

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

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

查看 UDP 如何处理大于底层网络数据包大小的数据报:UDP Sockets on Linux; send successfully but unable to receive large buffer

【讨论】:

    【解决方案2】:

    一般情况下,send() 不会阻塞,并且总是返回写入的字节数,除非内核中的本地(发送)缓冲区已满。对于基本上永远不会发生的 UDP 套接字。如果您的写入速度超过链接或接收端可以处理的速度,则会发生 TCP 套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2021-07-09
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多