Использование буфера повышения для сериализации и отправки по протоколу UDP - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу сериализовать и отправить некоторые данные по протоколу UDP.Код выглядит следующим образом:

typedef struct{
   uint8_t a[2];
   uint8_t b;
}example;
std::vector<example> ex_vector; //Filling part of this vector is notgiven here

void sendUDP(){
    int sockfd;
    sockfd = socket(AF_INET,SOCK_DGRAM,0);
    struct sockaddr_in serv;

    serv.sin_family = AF_INET;
    serv.sin_port = htons(5005);
    serv.sin_addr.s_addr = inet_addr("127.0.0.1");

    //const uint8_t buffer[2] = {0x12, 0x13}; -> Works well with this
    auto mutable_buffer = boost::asio::buffer(ex_vector);
    socklen_t m = sizeof(serv);
    sendto(sockfd,mutable_buffer,sizeof(mutable_buffer),0,(struct sockaddr *)&serv,m);
}

Как я могу сериализовать вектор элемента POD (example), используя boost?Код для UDP взят из (http://www.cplusplus.com/forum/unices/76180/).

В настоящее время выскакивает ошибка:

no matching function for call to 'sendto'
    sendto(sockfd,mutable_buffer,sizeof(mutable_buffer),0,(struct sockaddr *)&serv,m);

1 Ответ

1 голос
/ 20 сентября 2019

Из документации boost::asio::buffer:

Доступ к содержимому буфера можно получить с помощью функций-членов data () и size ():

boost::asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

(хотя мне интересно, почему вы смешиваете boost и posix, boost имеет boost::asio::ip::udp::socket, который должен безупречно работать с буфером, а примеры должны быть доступны в Интернете)

...