Самый эффективный способ отправки большого непрерывного буфера по UDP, если требуются заголовки пакетов? - PullRequest
0 голосов
/ 02 марта 2020

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

Однако используемый мной протокол требует, чтобы заголовки c, определяемые протоколом, были добавлены к каждому фрагменту данных перед отправкой. Заголовок должен быть в начале каждого пакета.

Наилучший способ, которым я думал для выполнения sh, на данный момент - это необходимость скопировать каждый байт данных из большого буфера перед отправкой, как показано ниже:

void UdpSender::udp_send()
{
    /**
     * A large buffer, simulating a ping-pong buffer filled in a separate thread
     */
    const size_t BUFFER_SIZE = 1024*1024*2;
    uint8_t send_buffer[BUFFER_SIZE];
    std::memset(send_buffer, 'a', BUFFER_SIZE);


    const uint16_t MAX_PACKET_PAYLOAD_SIZE = 1400;

    struct Packet
    {
        uint32_t header_value1;
        uint32_t header_value2;
        uint8_t payload[MAX_PACKET_PAYLOAD_SIZE];
    };

    //Offset into the large buffer
    uint8_t send_buffer_offset = 0;

    Packet packet;
    packet.header_value1 = 1;
    packet.header_value2 = 2;
    //Requires copying everything out of the buffer before sending
    std::memcpy(&packet.payload, &send_buffer+send_buffer_offset, MAX_PACKET_PAYLOAD_SIZE);

    sendto(active_socket_fd, &packet, sizeof(packet), 0, p_dest_addr, dest_addr_size);
}

Данные, которые мне нужно отправить, уже находятся в непрерывном буфере, который будет эффективен для отправки (не требуя дополнительных memcopys), если мне не нужно будет добавлять заголовок к каждому фрагменту отправляемых данных. Есть ли лучший способ, которым я мог бы подойти к этой проблеме, чтобы избежать memcopying всего буфера?

Спасибо!

...