Форум.orn

УВЛЕЧЕНИЯ, ХОББИ => Оч.умелые ручки => Тема начата: I-one от 01 Апреля 2013, 18:35:44

Название: Есть кто шарит в С++, помогите, а?
Отправлено: I-one от 01 Апреля 2013, 18:35:44
В общем задача такова. Есть сервер написанный на С++ и к сожалению утрачены связи с его программистом.
Из описания удалось вытащить вот что:
Клиент с сервером общаются через TCP соединение
Прием/передача 32-х разрядного целого (далее int) происходит в сетевом порядке байт (big-endian)
Прием/передача строки (далее string) заключается в передачи длины строки в байтах (long) и самой строки (строка utf16)
Прием/передача бинарных данных (далее binary) аключается в передачи длины данных в байтах (long) и самих данных

Я никогда не сталкивался с таким видом передачи данных, я на php пишу.
И цель такова, соединится с этим сервером через сокет отправить на него данные и получить ответ. Больше всего меня смущает как передать строку. Что значит сначала идет ее размер, потом строка. Если есть люди разбирающиеся в этом вопросе, посвятите пожалуйста.
Название: Re: Есть кто шарит в С++, помогите, а?
Отправлено: Bargamot от 01 Апреля 2013, 22:03:29
...Что значит сначала идет ее размер, потом строка. Если есть люди разбирающиеся в этом вопросе, посвятите пожалуйста.

Я не спец, но с таким таким алгоритмом сталкивался, когда идет передача строки не фиксированной длинны.
Т.е. сначала договариваешься о терминах - говоришь - моя строка 16 байт, далее вдуваешь строку, листенер примет 16 байт, и не более того.
В следующий раз может быть 32 байта, а может и 4. Просто говоришь, жди 4 байта.
Название: Re: Есть кто шарит в С++, помогите, а?
Отправлено: I-one от 02 Апреля 2013, 09:43:32
было бы хорошо пример, как такая строка выглядит визуально ?
Название: Re: Есть кто шарит в С++, помогите, а?
Отправлено: mimicria от 02 Апреля 2013, 09:57:01
Вопрос непонятен. Согласно описания для передачи строки надо посчитать и отправить её размер, а следом и саму строку. Если надо на с, то будет что-то типа
String test="BlahBlahBlah!";
long ssize=test.Length();
Socket->Send(...ssize); // тут смотря чем пользуешься для отправки
Socket->Send(...test);
Название: Re: Есть кто шарит в С++, помогите, а?
Отправлено: Bargamot от 02 Апреля 2013, 10:14:04
Прием/передача строки (далее string) заключается в передачи длины строки в байтах (long) и самой строки (строка utf16)

Да, в том протоколе походу жестко забито, что в первых 4-х байтах (long   : 4 bytes) будет заголовок передачи, в котором говорится, сколько байт с информацией ждать после заголовка.
Т.е.
1) получаете нужную строку к передаче.
2) определяете ее длинну (например, 20 байт).
3) проверяете длинна проходит?  (не будет ли переполнения?).
4) формируете новую строку=4 байта+20 байт
5) вдуваете в трубу 24 байта.

На стороне сервера пройдет обратное преобразование.