Поддерживает ли TCP непечатаемые символы?

Я новичок в протоколе TCP/IP и хотел бы создать сервер для чата на C++.

На данный момент я решил начать все свои передачи с символа, чтобы сказать, что будет дальше (запрос на вход, сообщение для публикации, имя пользователя клиента, ...).

Итак, я использую такие значения, как 0x01, 0x02, ... для того, что связано с входом в систему, запросом информации, ... и 0x10 для сообщений.

Безнадежно, когда я пытаюсь подключиться к своему серверу с помощью другой созданной мной программы, я получаю от сервера одну передачу, которая начинается с 0x01 (так что все по-прежнему в порядке), но затем, когда я отвечаю чем-то, начинающимся с 0x03, сервер только получить его, когда я убью клиента...

Я думаю, что это функция выбора, которая не говорит, что есть что читать.

Это нормально?

И если да, должен ли я заменить эти значения значениями, которые можно распечатать и не имеют особого значения?


person dido22    schedule 22.02.2017    source источник
comment
TCP работает с байтами, поэтому значения 0-255 независимо от того, являются ли они печатаемыми или непечатаемыми символами. Выберите совершенно другой подход. Поместите все в одно сообщение с заголовком.   -  person Erik Šťastný    schedule 22.02.2017
comment
Да, TCP вполне доволен бинарными данными. Поделитесь соответствующими разделами как вашего клиента, так и сервера/   -  person Colin    schedule 22.02.2017
comment
@ErikŠťastný ErikŠťastný Но работает ли выбор со значениями 0–255?   -  person dido22    schedule 22.02.2017
comment
Мы не знаем, какие классы или dll вы используете для связи. Мы не можем знать, что выбрать? какой-то метод или что? Но TCP не имеет ничего общего с символами. TCP отправляет и получает массивы байтов. например, я использую в своем приложении этот формат: 4bytes length of message, 4 bytes ID message, xxxx bytes of data и это одно сообщение, отправленное через TCP   -  person Erik Šťastný    schedule 22.02.2017
comment
если вам нужна помощь, вам придется отправить код.   -  person Erik Šťastný    schedule 22.02.2017
comment
ИМХО, ваша проблема не связана с использованием непечатаемых символов. Попробуйте отправить несколько печатных символов назад и вперед, чтобы увидеть, работает ли это. Если все еще не удается, то печатать или нет не имеет значения. Предложение: найдите учебник с рабочим примером и начните с него.   -  person ravenspoint    schedule 22.02.2017
comment
TCP не имеет реального представления о сообщениях, а только о потоке. Это означает, что он гарантирует, что все байты, отправленные одной стороной, достигнут другой стороны в том же порядке, но сообщения могут быть объединены (одно чтение для более чем одного сообщения) или считано по частям (много чтений для одного сообщения). Но он передает любой байт без особого смысла...   -  person Serge Ballesta    schedule 22.02.2017
comment
@ErikŠťastný TCP работает с октетами. Их часто называют байтами, но C++ (а также C) имеют другое определение байта (в частности, размер символа, который может быть 9, 16 или 32 бита), и этот вопрос помечен как C++.   -  person Martin Bonner supports Monica    schedule 22.02.2017


Ответы (1)


TCP — полностью бинарный протокол. Он определяет заголовок пакета, который следует за заголовком дейтаграммы IP. Непрерывный поток данных делится на пакеты, поэтому он (надеюсь) беспрепятственно проходит из точки А в точку Б. Поток состоит из произвольных октетов (байтов).

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

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

person Potatoswatter    schedule 22.02.2017
comment
@osgx UDP не имеет механизма повторной передачи, но вы можете добавить свой собственный. TCP не имеет надежного механизма сброса, и обходные пути, как правило, отстой. Выбрать свой яд. - person Potatoswatter; 22.02.2017