【问题标题】:When ACK lost, both sender and receiver stop?当ACK丢失时,发送方和接收方都停止了吗?
【发布时间】:2013-10-28 14:43:42
【问题描述】:

我正在实施一个基于 UDP 的停止等待 ARQ。我正在尝试模拟错误概率。

在发送者和接收者中,我都有一个while() 循环来继续发送和接收。一切正常,直到我在接收端引入错误概率。

我故意让接收方即使收到包也不发送ACK(模拟ACK丢失的情况)。

让我吃惊的是发送者和接收者都挂了!我知道这一点是因为为了调试,我在发送者和接收者的 while 循环中都放了一个 printf() 并且没有打印任何内容。

为什么会这样?即使没有传输任何内容,while 循环(独立于sendto()recvfrom())也不应该停止。

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    我认为问题在于您在发送方和接收方的 while 循环中都有 recvfrom

    recvfrom 文档说:

    如果套接字上没有可用的消息,则接收调用会等待消息到达,除非套接字是非阻塞的。

    要使套接字非阻塞,请参阅有关 MSG_DONTWAIT 标志的文档。

    所以,我猜当你让接收者没有发送你的确认消息时,发送者只是停止并等待 recvfrom 函数,而接收者通过 while 循环第二次挂在自己的 recvfrom 函数上省略确认消息(发送者和接收者都使用阻塞函数recvfrom,其中1个需要发送消息)。

    【讨论】:

    • 哇!我用gdb证明了你的说法,它确实卡在了recvfrom。但我想知道如果是这样,我们将如何实现超时?
    • 我的猜测是,您可以使用 MSG_DONTWAIT 标志使 recvfrom 函数非阻塞,然后将 if ... TIMEOUT 代码部分放入某种 while 循环中。将 recvfrom 调用放在这个新的超时循环中,因为它是非阻塞的,while 循环将继续循环检查它是否可以接收消息。一旦超时到期,您可以采取适当的重新传输或任何您想要的操作。不确定它是否会起作用,但值得一试。
    • 太棒了!我做到了。谢谢:)
    • 您可能希望将代码示例保留在问题中,以便这篇文章对其他用户有所帮助...
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2013-06-01
    • 2021-02-03
    • 2011-07-26
    • 1970-01-01
    • 2016-01-22
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多