【问题标题】:UDT send() - How to guarantee the sending of the entire bufferUDT send() - 如何保证整个缓冲区的发送
【发布时间】:2014-02-22 19:37:10
【问题描述】:

我一直在使用 UDT 库一个基于 udp 的协议来发送文件,我注意到 send 函数在以阻塞模式返回之前将数据发送到缓冲区。然而,发送函数似乎返回而不以阻塞模式发送整个数据(send() 返回发送的数据量)。这个问题的可能原因是什么?如果无法解决问题,应该怎么做才能发送剩余的数据?我为 tcp 和 udp 使用了 winsock 库,但我没有得到 tcp 或 udp 发送的这个概率(与 udt 的功能相似)。通过传输相同的文件和网络测试所有程序。

    int a;
    if (UDT::ERROR == (a = UDT::send(*(UDTSOCKET*)sock, buffer, size, 0)))
    {
        cout << "send: " << UDT::getlasterror().getErrorMessage() << endl;
        return -1;
    }
    else
    {
        return a;
    }
    This is the code i use. the value of 'a' is not the same as 'size' at times.                     

我知道如果它是非阻塞的,这可能会发生,但我正在使用无限超时的阻塞发送。

【问题讨论】:

  • 是否设置了发送超时?你的实际问题是什么?为什么这是一个问题?

标签: networking protocols winsock udp-data-transfer


【解决方案1】:

如果您设置了发送超时,这可能是超时。如果不是,您可以认为这是对连接致命的错误。您可以致电getlasterror 了解问题所在。

【讨论】:

  • 感谢您的回答。我没有设置发送超时。我会检查 getlasterror 并尝试看看出了什么问题。
  • 我尝试使用 getlasterror() 但这并没有给我任何回报。遇到这个问题只针对 udt,不针对 tcp 和 udp。不知道这是如何发生的。我应该改变缓冲区大小还是什么?
  • “没有给我任何回报”是什么意思?你的意思是它返回成功(0)?您应该可以再次致电send 发送更多信息或收到错误消息。
  • 我实际上在想阻塞发送意味着它只有在将所有数据发送到内核缓冲区后才会返回,因为它在 TCP 中工作。后来我意识到再次发送它是程序员的责任。感谢您提及 - “您应该能够再次调用 send 以发送更多信息或收到错误”我只需要对现有发送进行一些小改动。感谢您的提示!
【解决方案2】:

UDP 数据报被完整发送或根本不发送。你描述的情况是不可能的。请提供证据。

【讨论】:

  • 我认为你不明白他的问题。他说的是基于 UDP 的 UDT,而不是 UDP。 TCP 数据包完全发送或根本不发送,但在应用程序级别,您无需处理 apcket。
  • @DavidSchwartz 他说的是 send() 函数,据我所知,它没有发送完整的数据报。这不会发生。让我们看看证据。
  • 不,他不是。他说的是发送功能没有发送他要求的所有数据。他根本不是在谈论数据报。它们是 UDT 的实现细节,就像 TCP 一样。它们在应用层不可见,因为 UDT 隐藏了它们,就像 TCP 一样。
  • @David 你是对的。 udt 建立在 udp 之上以确保可靠性。它有两个变体 - 流和 dgram,我正在使用流模式。该协议工作在应用层,负责数据包的传递。用户只看到 send 和 recvs 的返回值。
猜你喜欢
  • 2012-09-21
  • 2011-04-03
  • 2020-07-07
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多