Как отправить структуру с помощью sendto () - PullRequest
2 голосов
/ 31 августа 2010

Я создал структуру:

struct buffer
{
    string ProjectName ;
    string ProjectID ;
}

buffer buf;
buf.ProjectID = "212";
buf.ProjectName = "MyProj";

Теперь, чтобы отправить эту структуру с помощью метода sendto, я типизирую структуру и отправляю ее обратно, как показано ниже:

char *sendbuf = (char*)&buf;
sentbytes = sendto(sock,sendbuf,strlen(sendbuf),0,(sockaddr*)&their_addr,sizeof(their_addr));

Но пока яЯ использую свой Struct ti char*, реальные данные теряют свои значения, и во время отладки я вижу, что sendbuf содержит некоторые другие значения.

Может кто-нибудь сообщить мне, как я могу отправить вышеуказанную структуру с помощью sendto.

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

std::string хранит свои данные в динамически распределенной памяти. Вы можете отправить отдельно каждую строку и длину строки, которые вы можете получить, используя std::string::c_str и std::string::size.

2 голосов
/ 31 августа 2010

Вам нужно создать структуру, используя POD, строка не может быть использована таким образом.Вместо этого вам нужно объявить что-то вроде

struct buffer
{
  char ProjectName[MAX_LENGTH_PROJECT_NAME+1];
  char ProjectID[MAX_LENGTH_PROJECT_ID+1];
};

EDIT: пояснение: строка содержит указатель на блок памяти, выделенный в куче, поэтому вы фактически не отправляете символы при попытке отправить эту структуру.1004 *

1 голос
/ 31 августа 2010

Предпочитайте использовать marshall / unmarshall при отправке данных по сети. Стиль C ++ - использовать «<< / >>» для потоковой передачи в отправляемый буфер. Таким образом, вы получаете больше контроля над тем, что вы отправляете и как оно отправляется (двоичный, текстовый, xml, ...). Boost также имеет модуль сериализации .

...