Программа перестает работать после чтения, в то время как возвращаемое значение корректно - PullRequest
0 голосов
/ 12 апреля 2019

Итак, у меня есть клиент-серверная программа на основе протокола TCP.Во-первых, сервер отправляет клиенту число байтов для чтения (4 байта (длина строки) и 2 байта для кода), и это работает нормально, но затем я отправляю строку с указанным длиной, и клиент перестает работать должным образом.

Код сервера:

// char *array = malloc(20000);
// ....
if (write(msg_sock, &filesSendHeader, sizeof(struct AllFiles)) != sizeof(struct AllFiles))
   syserr("partial / failed write");

if (write(msg_sock, array, howMany + 1) != howMany + 1)
   syserr("partial / failed write");

msg_sock - это сокет для получения от функции accept.

array - массив символов размера 20000,

howMany + 1 - длина строки(включая 0 символов)

filesSendHeader является экземпляром struct AllFiles и содержит один 4-байтовый и 2-байтовый номер

Код клиента:

  // char *array = malloc(20000);
  // ....
  //For reading first struct
  prev_len = 0;
  while (prev_len < sizeof(struct AllFiles)) {
    received = read(sock, ((char*)&file_info) + prev_len, sizeof(struct AllFiles) - prev_len);
    if (received < 0)
      syserr("reading from server socket");
    prev_len += received;
  }

  // Printing struct AllFiles fields and converting them with ntoh...
  // Then reading a string
  uint32_t to_read = ntohl(file_info.value);
  printf("Bytes read:%ld\n", read(sock, array, to_read));
  printf("Hey");

sock - сокет, клиентподключается к серверу через (из getaddrinfo)

file_info - экземпляр struct AllFiles

Код сервера после записи в сокет выполняется нормально.Клиент печатает правильное количество прочитанных байтов, но затем он перестает работать (программа запускается, но ничего после второй до последней инструкции не выводится).«ЭЙ» не распечатывается.

Что я делаю не так?

Редактировать:

Я попытался запустить программу с помощью valgrind, но не выдал проблем с памятью.Я также сделал file_info.value = ntohl(file_info.value); в клиентской части перед отправкой строки, но, как я сказал, struct AllFiles получена правильно (я распечатал ее).

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