Передача структур с использованием UDP - PullRequest
0 голосов
/ 06 августа 2011

Я пытался отправлять и получать структуры на одной и той же машине, используя UDP, а сервер и клиент в этом случае работают на одной и той же машине и совместно используют общие определения структуры (используя заголовочный файл).

Hostentструктура defn (встроенный тип UNIX):

    struct hostent{
      char *h_name;
      char **h_aliases;
      int h_addrtype;
      int h_length;
      char **h_addr_list;
    }

Ниже приведен фрагмент кода сервера:

    struct hostent* resolved_host = DNS_translate(DNSname);
    if((numbytes = sendto(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr))) == -1)
    {
      perror("sendto failed");
      exit(EXIT_FAILURE);
    }

Ниже приведен фрагмент кода клиента:

    struct hostent resolved_host;

    int addr_len = sizeof(struct sockaddr);

    if((numbytes = recvfrom(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&server_addr, &addr_len)) == -1)
    {
      perror("recvfrom failed");
      exit(EXIT_FAILURE);
    }

Сервер отправляети клиент получает как обычно (без ошибок).Структура * resolved_host * заполняется на сервере, и все его данные могут быть доступны без проблем.Однако, если я сейчас пытаюсь использовать структуру * resolved_host * в клиенте, я получаю ошибку сегмента.Например:

    printf("Name : %s\n", resolved_host.h_name);

вызывает ошибку сегмента.(но работает на сервере)

Ответы [ 3 ]

3 голосов
/ 06 августа 2011

Ваша структура полна указателей.Когда вы отправляете его по сети, вы отправляете фактические адреса, а не данные, на которые указывают эти указатели.

Эти адреса недопустимы в целевом процессе.

Вам потребуется сериализоватьданные сами.См. Примеры:

2 голосов
/ 06 августа 2011

Структура содержит указатели - поэтому, когда вы копируете структуру по UDP, вы копируете только значения этих указателей (то есть адреса некоторых других куски данных), а не сами данные.

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

1 голос
/ 06 августа 2011

Вы отправляете указателей . Даже на одной машине они недопустимы в разных адресных пространствах.

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