0

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

  1. 发送方收到一个正确的ACK,因此开始发送下一个数据包;
  2. 发送方接收到不正确的ACK数据包,因此重新发送该数据包;
  3. ACK发送方在 a 内收到 noTIMEOUT并因此重新传输此数据包。

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

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

1 回答 1

0

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

手册页:“EAGAIN 或 EWOULDBLOCK:套接字被标记为非阻塞并且接收操作将阻塞,或者已设置接收超时并且在接收数据之前超时已过期。”

于 2013-10-22T03:43:22.183 回答