Использование recv () для получения номера порядка сетевых байтов uint32 иногда работает, а другие нет (с использованием тех же команд) - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю клиент / сервер через 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 или сетевого порядка байтов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...