C Socket Write с добавлением дополнительных символов - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь добавить "" к сообщениям в программе чата. В приведенном ниже примере buf - это массив символов, содержащий сообщение. Странная вещь, когда я отправляю это через сокет с помощью write (), он отправляет его в 2 пакета Первый пакет - правильное сообщение, затем второй пакет - 2-3 случайных не алфавитных символа ascii. Есть идеи, что случилось? Когда я просто посылаю buf вниз по сокету, он работает правильно.

char nickmsg[550];
strcpy(nickmsg, "<");
strcat(nickmsg, username);
strcat(nickmsg, "> ");
strcat(nickmsg, buf);
write(sd, nickmsg, sizeof(nickmsg));

Ответы [ 5 ]

5 голосов
/ 13 ноября 2011

Вам не нужен sizeof (nickmsg), вам нужен strlen (nickmsg).Используя sizeof (nickmsg), вы отправляете все, что находится в этом буфере, а не только строку, которую вы в него встроили.Если вы хотите отправить только символы в строке, вам нужно вычислить длину того, что там есть.(кстати, есть более эффективные способы создания строк, чем повторяющиеся strcats)

1 голос
/ 13 ноября 2011

У вас есть этот код:

char nickmsg[550];
strcpy(nickmsg, "<");
strcat(nickmsg, username);
strcat(nickmsg, "> ");
strcat(nickmsg, buf);
write(sd, nickmsg, sizeof(nickmsg));

Это всегда отправляет 550 байтов, поскольку sizeof(nickmsg) равно 550. Конец сообщения будет помечен нулевым байтом, посколькуnicknmsg - это строка в стиле C.

Если получатель всегда захватывает 550 байтов и игнорирует все байты после нуля, это будет работать нормально.Вы просто будете отправлять клиентам ненужные байты, которые могут утечь конфиденциальную информацию.

Вопрос в том, что вы должны отправлять?Что означает для обозначения конца сообщения?

Внимание : Не изменяйте sizeof(nickmsg) на strlen(nickmsg).Это оставит клиенту нет способ идентифицировать конец сообщения.(Если вы не уверены на 100%, клиенту не нужно идентифицировать конец сообщений.)

1 голос
/ 13 ноября 2011

write() не отправляет лишние символы, вы .

write(sd, nickmsg, sizeof(nickmsg));

Отправит 500 символов (размер вашего массива).Поскольку вы не инициализировали все элементы массива на 0, вы получаете любой мусор в памяти после данных, которые вы в него вставили.

Вы хотите:

write(sd, nickmsg, strlen(nickmsg) + 1);
0 голосов
/ 13 ноября 2011

Если вы отправите его таким образом, напишите (sd, nickmsg, sizeof (nickmsg));вы отправляете данные, эквивалентные размеру буфера. Хотя ваша строка может быть допустимой c строкой, заканчивающейся нулевым символом, но все же клиент может не обрабатывать строки таким образом. (Если вы пишете свою собственную клиентскую программу, вы можете скрыть вклиентская программа).

0 голосов
/ 13 ноября 2011

Вы отправляете данные размером 500 байт, в пределах которых только первый strlen (имя пользователя) +3 имеет действительные данные Остальные - только неинициализированные данные.

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