私は実験的なLinuxカーネルモジュールを開発しているので...
LinuxカーネルからUDPブロードキャストする方法は?
-13は-EACCESです。SO_BROADCASTを設定していますか?SO_BROADCASTが設定されておらず、ブロードキャストアドレスに送信している場合、sock_sendmsgは-EACCESを返すと思います。
エラーコードの<errno.h>を探しています。
どのカーネルバージョンで開発していますか?カーネルソースを簡単に閲覧したいと思います。sock_setから-ENOPKGを返す方法はわかりませんが、-ENOPROTOOPTを返すことができることはわかります(カーネル2.6.27ではerrno 92です)。
ああ-そして、必要に応じて、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
頑張ってください-私はあなたのためにそれを解決できたらよかったのにと思います。
@adjuster..
実は、私はちょうどそれを手に入れました。設定すると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
manページからこれを持っています...
ENOPROTOOPT
示されたレベルでは、オプションは不明です。
...だから、それSOL_SOCKET
は渡すのに適切な値ではないと思います。運が悪かったIPPROTO_UDP
のではなく、私も試しました。SOL_SOCKET
編集:httpSO_BROADCAST
://docs.hp.com/en/32650-90372/ch02s10.htmlはそれがレベルのオプションであると言っていますがSOL_SOCKET
、私は-92を取得し続けます
編集:私は必死なのでSOL_UDP
、まだ-92を試しました。
はい、それは楽しいです:) ...良い相乗効果!最後に(私たちはすぐにそこに着くことを願っています)決定的な答えをきれいで素敵に組み立てましょう!:)
編集:ブロードキャストフラグをハードセットした場合でも、sock_sendmsg
失敗します(-13、「許可が拒否されました」)
sock->sk->sk_flags |= SO_BROADCAST;
私は本当にこれについていくつかの助けが必要です。
うーん、私はあなたを助けるためにもっと時間があればいいのに.
UDP マルチキャストを機能させるには、カーネルに組み込む必要があります。カーネルを構成するときに有効にする必要があります。Google には詳細情報が必要です。これがあなたを正しい軌道に乗せることを願っています。
以下は私にとってはうまくいきました(最終的にこのスレッドを閉じることができました)。
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 ソケットであり、addr はブロードキャスト アドレスを含むstruct sockaddr_inである必要があります。
Linux カーネルの IPVS (Linux 仮想サーバー) コードを見てください。フェールオーバーのために接続状態を共有するために使用する UDP マルチキャストの実用的な実装が既にあります。
すでにこれを見て、これを行った人を知っているので、netfilter リンクを作成し、ユーザー空間デーモンを使用してネットワーク経由で情報をブロードキャストすることを強くお勧めします。