Проблема передачи нулевого символа через сокеты - PullRequest
1 голос
/ 21 февраля 2009

Я пишу небольшой Java-сервер и соответствующий клиент на C ++, которые реализуют простой IM-сервис по протоколу STOMP .

Протокол указывает, что каждый кадр (сообщение, которое проходит между сервером и клиентом, если хотите) должен заканчиваться нулевым символом, который в коде я называю '\0', как в Java, так и в C ++.

Однако, когда я передаю кадр по TCP через сокеты, нулевой символ просто не появляется ни с одной стороны. Я работаю с кодировкой UTF-8, и попытался перейти на ASCII, не помогло.

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

Ответы [ 5 ]

2 голосов
/ 21 февраля 2009

Если вы кодируете текст в ASCII или UTF-8, вы конвертируете свои «буквы» в поток байтов (байтовых кодировок). Вам необходимо добавить нулевой байт в конец строки сообщения.

[Угадай] Вы можете использовать высокоуровневую библиотеку с таким методом, как «WriteLine (String line)» для отправки данных по сети. Документация для этого метода с описанием того, какие байты фактически отправляются, что обычно включает в себя кодировку текста сообщения в текущей кодировке (ASCII, UTF-8 и т. Д.), За которой следует последовательность завершения строки, которая обычно является байтом 13, 10 м или их комбинация ('\ n', '\ r \ n').

Используйте низкоуровневый метод Write () или метод WriteBytes () (в зависимости от ваших библиотек). Преобразуйте текст в ASCII или UTF-8, добавьте нулевой байт в конец и отправьте именно то, что вы хотите отправить.

1 голос
/ 21 февраля 2009

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

0 голосов
/ 21 февраля 2009

Вы находитесь на C ++?

Ошибка новичка - поместить NUL в конец строки: "Foo!\x00".

Конечно, тинг, который записывает строку, обрабатывает этот первый NUL как конец строки и не передает его. Вам необходимо закрасить нуль символ '\x00' явно как символ (с помощью putChar или каким-либо образом с ++), а не как часть строки.

0 голосов
/ 21 февраля 2009

Первое, что вам нужно сделать, это использовать Wireshark (или что-то подобное), как предложено Спенсером.

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

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

0 голосов
/ 21 февраля 2009

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

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

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