UDT send() - Как гарантировать отправку всего буфера
Я использовал библиотеку UDT на основе протокола udp для отправки файлов, и я заметил, что функция send отправляет данные в буфер перед возвратом в режиме блокировки. Однако функция send, похоже, возвращает без отправки всех данных в режиме блокировки (send() возвращает количество отправленных данных). В чем может быть причина этой проблемы и что нужно сделать, чтобы отправить оставшиеся данные, если проблема не может быть решена? Я использовал библиотеку winsock для tcp и udp, но я не получаю эту пробу для tcp или udp send(похоже на функциональность 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.
Я знаю, что это может произойти, если его неблокирование, но я использую блокировку отправки с бесконечным таймаутом.
2 ответа
Если установлен тайм-аут отправки, вероятно, это тайм-аут. Если нет, вы можете считать это ошибкой, которая является фатальной для соединения. Вы можете позвонить getlasterror, чтобы узнать, что пошло не так.
UDP датаграммы отправляются целиком или не отправляются вообще. Ситуация, которую вы описываете, невозможна. Пожалуйста, предоставьте ваши доказательства.