Как отправить структуру в сокет связи под платформу Windows, используя C ++ - PullRequest
1 голос
/ 28 июля 2011

struct ss {int data; строковое имя;} * o;

это моя структура в клиентском приложении я хочу отправить это на сервер (в TCP-сервере под Windows); Как это сделать.. Я знаю, что сериализация - это решение. но я не знаю, как это сделать .. пожалуйста, помогите мне, если можете.

Ответы [ 4 ]

2 голосов
/ 28 июля 2011

http://www.parashift.com/c++-faq-lite/serialization.html

Если вы используете Boost для сериализации, прочитайте это Сериализация и отправка объектов по TCP с использованием boost

Я обычно пишу свой собственный формат данных для передачиэти данные.

Я создам символьный буфер.

Укажите размер пакета.Преобразовать целое число в байты и скопировать его.Добавьте длину строки. Скопируйте имя, перешлите его.

0 голосов
/ 28 июля 2011
// send some data to a socket
send( 
  socket,        // the open socket
  o,             // pointer to the data
  sizeof( ss ),  // number of bytes
  0 );           // no special flags

Сложность на другом конце!Получатель должен знать, сколько байтов нужно прочитать и в какой структуре их хранить.

Вам нужно либо написать собственный код для решения этих проблем, либо использовать протокол, работающий поверх сокетов.Код не сложен, но некоторый опыт работы с некоторыми из многих доступных протоколов поможет с ошибками!

0 голосов
/ 28 июля 2011

Это очень хорошее руководство: http://beej.us/guide/bgnet/output/html/multipage/index.html. это не строго для окон, но изменения очень незначительны.

Вам необходимо сериализовать данные в буфер, а затем использовать функцию отправки. передать идентификатор сокета и буфер и т.д ...

int send(

__ в розетке, __in const char * buf, __in int len, __in int flags );

от http://msdn.microsoft.com/en-us/library/ms740149(v=vs.85).aspx

0 голосов
/ 28 июля 2011

Сначала нужно знать, известно ли, что клиент и сервер всегда имеют одинаковую архитектуру или нет. Это решает, можете ли вы просто отправить data как есть, или вам нужно заботиться о порядке байтов и размере целого числа. В любом случае, ntohl и htonl позаботятся о порядке байтов и позволят вам передать int простым, определенным способом (без операций на машинах, которые уже имеют сетевой порядок байтов).

Что касается string, вы можете отправлять как размер, так и содержимое по TCP просто отлично (преобразовав размер с htonl), предполагая, что строковые данные либо в одной и той же кодировке с обеих сторон, либо " Общее, независимое "кодирование всегда используется, например UTF-8.
Если вы не знаете, какие кодировки используют машины на обоих концах, у вас проблемы. В этом случае вы должны включить сообщение, определяющее это, и соответственно преобразовать (аналогично тому, как это делают, например, веб-серверы).

Работа протокола TCP в «нормальном режиме» означает, что алгоритм Нейгла будет включен, поэтому вы можете просто использовать 3 вызова send, и сетевой уровень преобразует это в такое количество пакетов, которое он считает разумным (вместо отправки отдельный пакет только для целого числа).

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

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