Networking UDT send()-如何保证整个缓冲区的发送

Networking UDT send()-如何保证整个缓冲区的发送,networking,protocols,winsock,udp-data-transfer,Networking,Protocols,Winsock,Udp Data Transfer,我一直在使用UDT库一种基于udp的协议来发送文件,我注意到send函数在以阻塞模式返回之前将数据发送到缓冲区。但是,send函数似乎返回,而不以阻塞模式发送整个数据(send()返回发送的数据量)。出现此问题的可能原因是什么?如果无法解决问题,应如何发送剩余数据?我对tcp和udp使用winsock库,但对tcp或udp发送(与udt的功能类似)没有这个问题。通过传输相同的文件和网络测试所有程序 int a; if (UDT::ERROR == (a = UDT::send(*

我一直在使用UDT库一种基于udp的协议来发送文件,我注意到send函数在以阻塞模式返回之前将数据发送到缓冲区。但是,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.                     
inta;
if(UDT::ERROR==(a=UDT::send(*(UDTSOCKET*)sock,buffer,size,0)))
{

如果你有一个发送超时设置,这可能是一个超时。如果不是,你可以认为这是一个致命的连接错误。你可以打电话查出到底出了什么问题。

< P > UDP数据报全部发送或根本不发送。你描述的情况是不可能的。请提供你的证据。是您的实际问题吗?为什么会出现此问题?谢谢您的回答。我没有设置发送超时。我将使用getlasterror检查并尝试查看出现了什么问题。我尝试使用getlasterror()但这并没有返回任何信息。仅在udt中遇到此问题,而不是在tcp和udp中遇到此问题。不知道这是如何发生的。我是否应该更改缓冲区大小或其他内容?您所说的“没有返回任何信息”是什么意思?您的意思是它返回了成功(0)?您应该能够再次调用以发送更多数据或获取错误。我实际上认为阻止发送意味着它只有在将所有数据发送到内核缓冲区后才能返回,因为它在TCP中工作。我后来意识到再次发送是程序员的责任。感谢您提到-“您应该能够再次调用send以发送更多信息或获取错误信息“我只是需要对现有的发送进行一点更改。谢谢你的提示!我认为你不理解他的问题。他说的是UDP上的UDT,而不是UDP。TCP数据包完全发送或根本不发送,但在应用程序级别,你没有处理APCKET。@DavidSchwartz他说的是发送()就我所知,函数没有发送完整的数据报。这不会发生。让我们看看证据。不,他没有。他说的是发送函数没有发送他要求发送的所有数据。他根本没有谈论数据报。它们是UDT的一个实现细节,就像TCP一样。它们在应用程序中不可见层,因为UDT隐藏它们,就像TCP一样。@David You是对的。UDT是在udp上构建的,以确保可靠性。它有两个变体-stream和dgram,我使用的是stream模式。该协议在应用层工作,负责数据包的传递。用户只看到send和Recv的返回值。