Программа TCP Client Server

#c

#c

Вопрос:

Я выполняю задание по программированию, и я в значительной степени выяснил недостающую информацию из приведенного скелетного кода, однако, хоть убейте, я не могу понять, как на самом деле распечатать сообщение, полученное от клиента! int recv (int socket, char *buff, int buff_len, флаги int) Я использую это заполненное с надлежащей информацией, надеюсь, для получения сообщения от клиента. Однако я понятия не имею, как на самом деле распечатать это на сервере!

Я попробовал cout << buff; но, похоже, это просто нарушает работу программы. Я должен также отметить, что я выполняю это назначение в Putty.

Ответ №1:

Вы не показали фактический код, который вы используете для получения и печати сообщения, но наиболее вероятная причина, по которой cout << buff; происходит неправильное поведение, заключается в том, что он ожидает, что его аргумент будет указывать на массив символов, завершающийся 0, и recv() не завершает 0 данные, которые он записывает в ваш массив. Из-за этого логика печати в << операторе будет повторяться после конца массива в поисках байта с 0-терминатором и вызывать неопределенное поведение.

Простой способ избежать этой проблемы — самостоятельно добавить байт с 0-терминатором, вот так:

  char buff[512];
 int numBytesReceived = recv(sockFD, buff, sizeof(buff)-1, 0);
 if (numBytesReceived > 0)
 {
    buff[numBytesReceived] = '';  // place 0-terminator byte at end of received data
    cout << buff << endl;  // now it's safe to print
 }
 else if (numBytesReceived == 0) cout << "connection closed!" << endl;
 else perror("recv");
  

Комментарии:

1. Извините, я относительно новичок в C , просто давным-давно прошел базовый курс по нему. что именно представляет собой массив символов, заканчивающийся 0? это просто массив с 0 в качестве последнего слота для указания cout прекратить печать? Есть ли какой-либо другой способ распечатать его без всех этих дополнительных шагов? как printf,

2. Смогу ли я сократить это, просто добавив ‘/ 0’ в конец buf перед отправкой его на сервер?

3. Также, если бы я распечатал другой массив с помощью cout, будет ли он распечатывать весь массив без проблем, если я назначу ‘ 0’ в конец

4. Массив, заканчивающийся 0, — это просто любой массив символов с символом ‘ 0’ для обозначения конца допустимых символов; именно так строки в стиле C указывают конец строки. Вы могли бы отправить символ » по сети с сервера, если хотите, но это не будет работать надежно, поскольку нет гарантии, что все отправленные вами символы будут получены вместе в одном recv() вызове. Любой массив с в конце должен быть напечатан без проблем.