2014-10-19 3 views
1

Итак, я пытаюсь отправить сообщение клиенту с помощью функции sendto().Отправка структуры в функции sendto() - язык C

прототип Функция SendTo() заключается в следующем:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
       const struct sockaddr *dest_addr, socklen_t addrlen); 

Но я хотел бы передать структуру в качестве второго аргумента. Возможно ли это сделать? Или buf должен быть строкой?

EDIT: Вы видите, что я должен быть в состоянии послать это:

«Сообщение состоит из„Header“, а затем„PAYLOAD“

Ваш заголовок сообщения должен состоять из следующих действий:.

uint8_t version; /* must be 1. If you receive anything else, discard*/ 
uint8_t ttl; /* must be 1. If you receive anything else, discard*/ 
uint16_t payload_length; /* bytes following the header */ 
uint32_t account_identifier; /* digits of your account name */ 
uint32_t source_address; /* unused for now, set to 0 and ignore. */ 
uint32_t destination_address; /* unused for now, set to 0 and ignore. */ 
uint16_t checksum; /* unused for now, set to 0 and ignore. */ 
uint16_t protocol; /* must be 1. If you receive anything else, discard*/" 

И полезная нагрузка представляет собой текстовую строку, как «Hello» или что-то.

Я чувствую, что единственный способ для меня, чтобы послать заголовок будет отправить на структуру всего, что Информация. Правильно?

ответ

2

Вы можете отправить любой непрерывный блок памяти sendto, поэтому struct без указателей будет в порядке. Тем не менее, клиент должен иметь возможность обрабатывать этот struct с использованием правильной компоновки, которая крайне ограничена.

Рассмотрим простой struct как это:

struct One { 
    int a; 
    float b; 
    char c[20]; 
}; 

Он отлично работает на том же оборудовании, когда клиент и код сервера компилируются тем же компилятором, используя одинаковые параметры. Немного другое оборудование вызовет проблемы даже для этого, казалось бы, простого struct, хотя: endianness, padding, размер различных представлений и т. Д. Все будет одинаково для того, чтобы это работало.

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

Если ваш struct имеет указатель, вы не сможете отправлять и получать его без какой-либо специальной обработки:

struct Two { 
    int a; 
    float b; 
    char* c; // <<<=== Not going to work 
}; 

Когда вам нужно отправить структуры, как это, вы «сериализации» их на отправителе в массив байтов, который может быть «десериализован» принимающим концом и вместо этого отправить этот буфер. Код, который получает этот буфер, «распаковывает» данные в «struct», выделяет память по мере необходимости и копирует данные из буфера приемника в эту вновь выделенную память.

struct выше, может быть сериализовать следующим образом:

  • 4 байта для int
  • 4 байта для float
  • 4 байта, представляющие длину len блока, на который указывает указатель c
  • len байт, представляющий содержание c
+0

Я не буду работать в интероперабельности. Аппаратное обеспечение сервера одинаково. – umdcoder

+0

Является ли структура с указателями действительной для отправки? – umdcoder

+1

@umdcoder Нет, это не так. В целом отправные структуры - плохая идея. Не используйте структуры как сетевые протоколы. Используйте сетевые протоколы в качестве сетевых протоколов. – EJP

Смежные вопросы