3

私は実験的なLinuxカーネルモジュールを開発しているので...

LinuxカーネルからUDPブロードキャストする方法は?

4

5 に答える 5

3

-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

頑張ってください-私はあなたのためにそれを解決できたらよかったのにと思います。

于 2008-12-06T20:26:45.737 に答える
2

@adjuster..

実は、私はちょうどそれを手に入れました。設定するとSO_BROADCAST92(パッケージ未インストール)が届きます

では、どのパッケージをインストールする必要がありますか?


編集:カーネルのバージョンは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;

私は本当にこれについていくつかの助けが必要です。

于 2008-12-06T20:29:59.817 に答える
1

うーん、私はあなたを助けるためにもっと時間があればいいのに.

UDP マルチキャストを機能させるには、カーネルに組み込む必要があります。カーネルを構成するときに有効にする必要があります。Google には詳細情報が必要です。これがあなたを正しい軌道に乗せることを願っています。

于 2008-12-06T20:14:30.660 に答える
0

以下は私にとってはうまくいきました(最終的にこのスレッドを閉じることができました)。

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である必要があります。

于 2016-06-22T10:38:53.477 に答える
0

Linux カーネルの IPVS (Linux 仮想サーバー) コードを見てください。フェールオーバーのために接続状態を共有するために使用する UDP マルチキャストの実用的な実装が既にあります。

すでにこれを見て、これを行った人を知っているので、netfilter リンクを作成し、ユーザー空間デーモンを使用してネットワーク経由で情報をブロードキャストすることを強くお勧めします。

于 2008-12-09T21:53:31.097 に答える