Я создаю клиент / сервер через tcp для передачи файлов (язык C): клиент отправляет запрос, сервер отправляет размер файла (порядок сетевых байтов uint32) и двоичный файл.Мне нужны пояснения для чтения клиентом uint32
-Client-
uint32_t filesize;
...
Создание сокетов и соединение с сервером, для цикла отправки всех файлов
...
if((recv(s, &filesize, sizeof(uint32_t), 0)) != sizeof(uint32_t))
{
printf("Filesize error\n"); continue;
}
filesize=ntohl(filesize);
...
-Server-
uint32_t filesize, filesize_t;
...
получить размер файла с помощью fstat
...
filesize_n = htonl(filesize);
if((send(s, &filesize_n, sizeof(uint32_t), 0)) != sizeof(uint32_t))
{
printf("Filesize error\n"); continue;
}
Проблема в том, что клиент иногда получает неправильный размер файла, даже если сработал предыдущий запуск.Используя Wireshark, я вижу, что отправленная полезная нагрузка верна, и Valgrind не показывает ничего странного в отношении памяти.Сервер уже протестирован с клиентом, данным моим профессором, поэтому он должен работать так, как задумано, а клиент - нет, я предполагаю, что проблема, вероятно, есть.Ifs на send и recv должны подтвердить, что количество байтов правильное.Есть идеи, почему recv не является детерминированным?Мало того, что, если размер файла правильный, получение фактического файла всегда работает, так что, возможно, проблема с обработкой формата uint32 или сетевого порядка байтов?