c - 当ACK丢失时,发送方和接收方都停止?

标签 c sockets

我正在实现基于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/

相关文章:

ios - 发送的 NSNotification 对象是(null)?

c - 套接字操作上的非套接字错误

c# - 无法使用 RESP 在 Redis 服务器上执行命令

java - 为什么我的客户端关闭连接

c - 套接字编程 - 具有客户端和服务器代码的进程

c - 有多少空字节,在 C 中连接字符串

C - 套接字编程 - 任意发送/接收 - 指针算术 - 数组不可分配

c - Lua C API : Stack empty after pcall error

c - 有没有办法将 EOF 发送到读取消息队列的进程?

c++ - 如何将单个应用程序的特定线程卸载到特定的 Xeon Phi 内核?