Автор Тема: Есть кто шарит в С++, помогите, а?  (Прочитано 2915 раз)

Оффлайн I-one

  • Завсегдатай
  • ****
  • Сообщений: 972
  • Карма: +84/-0
  • Hi!
    • Просмотр профиля
    • Сокровища в сети! Уникальная онлайн игра где можно заработать.
Есть кто шарит в С++, помогите, а?
« : 01 Апреля 2013, 18:35:44 »
В общем задача такова. Есть сервер написанный на С++ и к сожалению утрачены связи с его программистом.
Из описания удалось вытащить вот что:
Клиент с сервером общаются через TCP соединение
Прием/передача 32-х разрядного целого (далее int) происходит в сетевом порядке байт (big-endian)
Прием/передача строки (далее string) заключается в передачи длины строки в байтах (long) и самой строки (строка utf16)
Прием/передача бинарных данных (далее binary) аключается в передачи длины данных в байтах (long) и самих данных

Я никогда не сталкивался с таким видом передачи данных, я на php пишу.
И цель такова, соединится с этим сервером через сокет отправить на него данные и получить ответ. Больше всего меня смущает как передать строку. Что значит сначала идет ее размер, потом строка. Если есть люди разбирающиеся в этом вопросе, посвятите пожалуйста.
http://sokrovishavseti.ru/ - увлекательная, познавательная онлайн-игра с выводом денег. Присоединяйся!

Оффлайн Bargamot

  • Продвинутый
  • *****
  • Сообщений: 1959
  • Карма: +331/-0
    • Просмотр профиля
Re: Есть кто шарит в С++, помогите, а?
« Ответ #1 : 01 Апреля 2013, 22:03:29 »
...Что значит сначала идет ее размер, потом строка. Если есть люди разбирающиеся в этом вопросе, посвятите пожалуйста.

Я не спец, но с таким таким алгоритмом сталкивался, когда идет передача строки не фиксированной длинны.
Т.е. сначала договариваешься о терминах - говоришь - моя строка 16 байт, далее вдуваешь строку, листенер примет 16 байт, и не более того.
В следующий раз может быть 32 байта, а может и 4. Просто говоришь, жди 4 байта.
« Последнее редактирование: 01 Апреля 2013, 22:05:05 от Bargamot »

Оффлайн I-one

  • Завсегдатай
  • ****
  • Сообщений: 972
  • Карма: +84/-0
  • Hi!
    • Просмотр профиля
    • Сокровища в сети! Уникальная онлайн игра где можно заработать.
Re: Есть кто шарит в С++, помогите, а?
« Ответ #2 : 02 Апреля 2013, 09:43:32 »
было бы хорошо пример, как такая строка выглядит визуально ?
http://sokrovishavseti.ru/ - увлекательная, познавательная онлайн-игра с выводом денег. Присоединяйся!

Оффлайн mimicria

  • Продвинутый
  • *****
  • Сообщений: 2599
  • Карма: +1429/-9
  • return (true);
    • Просмотр профиля
Re: Есть кто шарит в С++, помогите, а?
« Ответ #3 : 02 Апреля 2013, 09:57:01 »
Вопрос непонятен. Согласно описания для передачи строки надо посчитать и отправить её размер, а следом и саму строку. Если надо на с, то будет что-то типа
String test="BlahBlahBlah!";
long ssize=test.Length();
Socket->Send(...ssize); // тут смотря чем пользуешься для отправки
Socket->Send(...test);

Оффлайн Bargamot

  • Продвинутый
  • *****
  • Сообщений: 1959
  • Карма: +331/-0
    • Просмотр профиля
Re: Есть кто шарит в С++, помогите, а?
« Ответ #4 : 02 Апреля 2013, 10:14:04 »
Прием/передача строки (далее string) заключается в передачи длины строки в байтах (long) и самой строки (строка utf16)

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

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