Как осуществлять UDP-трансляцию из ядра Linux? - PullRequest
3 голосов
/ 06 декабря 2008

Я разрабатываю экспериментальный модуль ядра Linux , поэтому ...

Как UDP Broadcast из ядра Linux?

Ответы [ 5 ]

3 голосов
/ 06 декабря 2008

-13 это -EACCES. У вас установлен SO_BROADCAST? Я считаю, что sock_sendmsg возвращает -EACCES, если SO_BROADCAST не установлен, и вы отправляете на широковещательный адрес.


Вы ищете для кодов ошибок.


Какую версию ядра вы разрабатываете? Я хотел бы кратко просмотреть исходный код ядра. Я не вижу, как -ENOPKG может быть возвращено из sock_set, но я вижу, что -ENOPROTOOPT может быть возвращено (что соответствует ошибке 92 в ядре 2.6.27).

Да, и, если хотите, поместите этот фрагмент кода туда, где вы устанавливаете SO_BROADCAST. Я не сделал этого, и я хотел бы взглянуть на это снова.


Попробуйте вызвать его с помощью SOL_UDP. Я думаю это то, что вы ищете. У меня нигде нет настройки среды сборки 2.6.18, чтобы играть с этим, но попробуйте.

Нет - неважно - это не будет делать то, что ты хочешь. Я должен был прочитать немного дальше в источнике. Я буду продолжать искать. Это довольно весело.


Полагаю, вы могли бы просто установить флаг трансляции самостоятельно! улыбка

lock_sock(sock->sk);
sock->sk->broadcast = 1;
release_sock(sock->sk);

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

http://kernelnewbies.org/Simple_UDP_Server

Удачи ... Хотел бы я решить это для вас.

2 голосов
/ 06 декабря 2008

@ регулировка ..

На самом деле, я только что понял. Когда я устанавливаю SO_BROADCAST, я получаю 92 (пакет не установлен)

Какой пакет я должен установить, тогда?


Редактировать: Ядро версии 2.6.18, и вы правы! 92 - это ENOPROTOOPT

//Socket creation
sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);

//Broadcasting
int broadcast = 1;
int err;

if( (err = sock->ops->setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof broadcast)) < 0 )
{
    printk(KERN_ALERT MODULE_NAME ": Could not configure broadcast, error %d\n", err);
    return -1;
}

Редактировать: Я получил это из setsockopt справочная страница ...

ENOPROTOOPT
Опция неизвестна на указанном уровне.

... Итак, я полагаю, что SOL_SOCKET не является правильным значением для передачи. Я также попробовал IPPROTO_UDP вместо SOL_SOCKET без удачи.


Редактировать: http://docs.hp.com/en/32650-90372/ch02s10.html говорит, что SO_BROADCAST является опцией уровня SOL_SOCKET, но я продолжаю получать -92


Редактировать: Я в отчаянии, поэтому я попробовал SOL_UDP, все еще -92.
Да, это весело :) ... Хорошая синергия! В конце (надеюсь, мы скоро туда доберемся) давайте соберем окончательный ответ, чистый и приятный! :)


Редактировать: Даже если жестко установить флаг вещания, sock_sendmsg не удастся (-13, «Отказано в доступе»)

sock->sk->sk_flags |= SO_BROADCAST;

Мне действительно нужна помощь в этом ..

1 голос
/ 06 декабря 2008

Мм, я бы хотел, чтобы у меня было больше времени, чтобы помочь вам.

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

0 голосов
/ 22 июня 2016

Следующее сработало для меня (так что, наконец, эту ветку можно было закрыть).

int yes = 1;
sock_setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

sock->ops->connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr), 0);

Здесь sock - это инициализированный struct socket , а адрес должен быть struct sockaddr_in с широковещательным адресом в нем.

0 голосов
/ 10 декабря 2008

Посмотрите на код IPVS (виртуальный сервер Linux) в ядре Linux. У него уже есть работающая реализация многоадресной рассылки UDP, которую он использует для совместного использования состояния соединения для отработки отказа.

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

...