【问题标题】:recvfrom() return values in Stop-and-Wait UDP?recvfrom() 在 Stop-and-Wait UDP 中返回值?
【发布时间】:2013-10-22 03:38:22
【问题描述】:

我正在尝试在 C 中实现Stop-and-Wait UDP 客户端-服务器套接字程序。众所周知,Stop-and-Wait 流控制基本上有三种可能的场景。即,发送数据包后,

  1. 发送方收到正确的ACK,从而开始发送下一个数据包;
  2. 发送方收到了错误的ACK,因此重新发送了这个数据包;
  3. 发件人在TIMEOUT 内没有收到ACK,因此重新传输此数据包。

我的想法是通过发送方返回值recvfrom()来区分这三种场景。

  • 对于场景 1&2:recvfrom() 只返回接收到的ACK 的长度。由于在我的实现中不正确的ACK 与正确的长度相同,所以我必须更深入地检查ACK 的内容。没什么大不了的。我知道该怎么做。
  • 当我试图识别没有收到ACK 的场景3 时,问题就来了。让我困惑的是我的recvfrom() 在一个while 循环中,所以recvfrom() 会被不断地调用。 当接收方实际上并未发送发送方ACK 时,它会返回什么?是 0 还是 1?

【问题讨论】:

    标签: c sockets udp


    【解决方案1】:

    如果由于设置 SO_RCVTIMEO, 而导致接收超时,recvfrom()(和朋友)将返回 -1,errno 设置为 EAGAINEWOULDBLOCK

    man page: "EAGAIN 或 EWOULDBLOCK: 套接字被标记为非阻塞,接收操作将阻塞,或者设置了接收超时并且在接收数据之前超时已过期。"

    【讨论】:

    • 根据手册页,只有在 NON_BLOCKING fd 上调用该函数并且没有数据可供读取时,该函数才会失败。 [EAGAIN] 或 [EWOULDBLOCK] 套接字的文件描述符标记为 O_NONBLOCK 并且没有数据等待接收;或设置了 MSG_OOB 并且没有可用的带外数据,并且套接字的文件描述符标记为 O_NONBLOCK 或套接字不支持阻塞以等待带外数据。
    • 不是根据上面引用的手册页,或者SO_RCVTIMEOhere的措辞。
    • 好的。你是对的。我对另一个手册页脚本感到困惑。感谢您的澄清。
    • @downvoter 我的奖杯柜的另一个被否决的正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    相关资源
    最近更新 更多