我正在实施基于UDP的停止等待ARQ 。我正在尝试模拟错误概率。
在发送方和接收方中,我都有一个while()
循环来继续发送和接收。一切正常,直到我在接收方引入错误概率。
我故意让接收方发送ACK
即使收到了数据包(以模拟ACK
丢失的情况)。
让我感到惊讶的是发件人和收件人都挂了!我知道这是因为要调试我在发送方和接收方的printf()
循环中放置while
并且没有打印任何内容。
为什么会这样?即使没有传输任何内容,while
循环(独立于sendto()
和recvfrom()
)也不应停止。
答案 0 :(得分:1)
我认为问题在于发送者和接收者在循环中都有recvfrom
。
recvfrom文档说:
如果套接字上没有可用的消息,则接收呼叫等待消息到达,除非套接字是非阻塞的。
要使套接字无阻塞,请参阅有关MSG_DONTWAIT标志的文档。
所以,我猜测当接收器没有发送你的确认消息时,发送器正在停止并等待recvfrom功能,接收器在第二次通过while循环后挂在它自己的recvfrom功能上省略确认消息(发送方和接收方都使用阻塞函数recvfrom,其中1个需要发送消息)。