TCP Client - получение сообщения от неизвестного / неограниченного размера - PullRequest
0 голосов
/ 02 ноября 2018

Я сейчас сижу на задании в университете и сталкиваюсь с проблемой, которую я не могу решить. Я разрабатываю TCP-клиент, который подключается к серверу и получает оттуда сообщение.

Клиент должен иметь возможность работать со строками любой длины и выводить все полученные символы, пока сервер не закроет соединение.

Мой клиент работает и с фиксированной длиной строки, я также могу получать сообщения, например, от djxmmx.net порт 17. Однако я не знаю, как отобразить эту произвольную длину.

Мои знания C действительно плохие, поэтому мне нужны некоторые предложения, идеи или советы о том, как реализовать мою проблему.

На самом деле это мой код для получения сообщений:

// receive data from the server
    char server_response[512];
    recv(client_socket, &server_response, sizeof(server_response), 0);

1 Ответ

0 голосов
/ 02 ноября 2018

Если вы собираетесь работать с вводом практически неограниченной длины, вам нужно будет вызывать recv() несколько раз в цикле, чтобы получить каждую последующую секцию ввода. Если вы можете работать с каждым разделом за раз, а затем отказаться от него и перейти к следующему разделу, это один из подходов. Если вам нужно обрабатывать все входные данные за один раз, вам нужно будет найти способ хранения произвольно больших объемов данных, возможно, с использованием динамического выделения памяти.

С recv() вы, вероятно, захотите зациклить чтение содержимого, пока оно не вернет 0, указывая, что сокет выполнил упорядоченное завершение работы (документация здесь ). Это может выглядеть примерно так:

char server_response[512];
ssize_t bytes_read;
while ((bytes_read = recv(client_socket, &server_response,
                          sizeof(server_response), 0)) > 0) {
  /* do something with the data of length bytes_read
     in server_response[] */
}
...