我正在实现基于UDP的停止等待ARQ。我正在尝试模拟错误概率。
在发送方和接收方中,我都有一个 while()
循环来保持发送和接收的进行。一切正常,直到我在接收方引入错误概率。
我故意让接收方即使收到了数据包也不发送ACK
(以模拟ACK
丢失的情况)。
令我惊讶的是发送方和接收方都挂起!我知道这一点是因为为了调试,我在发送者和接收者的 while
循环中放置了 printf()
,但没有打印任何内容。
为什么会发生这种情况?即使没有传输任何内容,while
循环(独立于 sendto()
和 recvfrom()
)也不应该停止。
最佳答案
我认为问题在于发送者和接收者的 while 循环中都有 recvfrom
。
recvfrom文档说:
If no messages are available at the socket, the receive calls wait for a message to arrive, unless the socket is nonblocking.
要使套接字成为非阻塞,请参阅有关 MSG_DONTWAIT 标志的文档。
所以,我猜测当你让接收者没有发送你的确认消息时,发送者只是停止并等待recvfrom函数,而接收者通过while循环第二次卡在自己的recvfrom函数上省略确认消息(发送方和接收方都使用阻塞函数recvfrom,其中1个需要发送消息)。
关于c - 当ACK丢失时,发送方和接收方都停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19637791/