2017-02-22 35 views
1

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

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

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

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

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

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

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

+2

TCP работает с байтами, поэтому значения 0-255 независимо от того, могут ли они печататься из непечатаемых символов. Выберите совершенно другой подход. Поместите все в одно сообщение с заголовком. –

+0

Да, TCP вполне доволен двоичными данными. Укажите соответствующие разделы как вашего клиента, так и сервера/ –

+0

@ ErikŠťastný Но выбирает также работает с 0-255 значениями? – dido22

ответ

4

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

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

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

+3

Но UDP может помочь создать неожиданную потерю пакетов ... – osgx

+0

@osgx UDP не имеет механизма повторной передачи, но вы можете добавить свой собственный. У TCP нет надежного механизма промывки, и обходные пути обычно сосут. Выбрать свой яд. – Potatoswatter