Linux / C udp методы отправки - PullRequest
3 голосов
/ 13 июня 2011

Единственный способ отправить UDP-пакеты в C - это использовать вызовы send / sendo / write / ....

Проблема в том, что для каждого пакета мне нужно выполнить новый вызов изuser-space.

Кто-нибудь знает, существует ли функция, которая позволяет что-то вроде

send_packets (int socket, const char * buffer, int packetSize)

, которыйавтоматически разбивать данные в буфере на пакеты размером packageSize (например, 1472) и затем отправлять их в виде пакетов UDP?

Спасибо

Ответы [ 2 ]

1 голос
/ 13 июня 2011

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

В Linux вы можете модифицировать ядро ​​для реализации API sendmmsg(), аналогичного recvmmsg(), но когда я это сделал, я зарегистрировал потерю производительности только из-за того, какгромоздкий интерфейс, который на самом деле должен использовать.

База пользователей такого API довольно ограничена, так как если вы действительно хотите высокую производительность, просто перейдите на InfiniBand или используйте API сокетов пользовательского пространства, предоставляемый Solarflare (OpenOnload) или Mellanox, который зависитна их интерфейсах 10 GigE RDMA через Ethernet.

0 голосов
/ 13 июня 2011

Этот интерфейс, кажется, не отражает ваши намерения, вы не говорите, сколько пакетов должно быть сгенерировано.

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

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

...