1

MacBookProでBOOTPを介してIPアドレスとパラメータを提供する必要がある小さなユーティリティを作成しています。

GitHubのAsyncUdpSocketライブラリを使用しました(RobbieHansonに感謝)。有線イーサネットのみを接続して(空港オフ)マシンを構成すると、動作します。ただし、Wifiも有効にするとすぐに、すべてのブロードキャスト応答が代わりにWifiインターフェイスを経由します。これにより、有線クライアントは応答を取得しません。

コードの初期化/受信:

if (![socket bindToAddress:@"0.0.0.0" port:67 error:&err])
    NSLog(@"Error: unable to bind (%@)", [err localizedDescription]);
[socket enableBroadcast:YES error:&err];
[socket receiveWithTimeout:-1 tag:0];

コードの送信:

[sock sendData:packetData toHost:@"255.255.255.255" port:68 withTimeout:-1 tag:0];

これを行う方法があるはずですが、これは私の最初のOS Xプログラムであり、フレームワークに合わせてgoogle-searchのエチケットを習得するのに苦労しています:)

アップデート

今夜、コードをいじって、AsyncUdpSocketを呼び出しているときに何をしているのかを調べました。基本的に私は次のような状況にあります。(ETH NICに割り当てられたアドレス)を呼び出しbindToAddressて提供すると10.0.0.1、パケットを受信せず、送信もできません。ただし、nilメソッドにパスすると、メッセージを送信してブロードキャストを受信できます。欠点は、送信がWIFI NIC(デフォルトルート)を介して送信されることです。

バックグラウンドで-AsyncUdpSocketライブラリはCFSocketSetAddress、nil値が指定されている場合はIFADDR_ANYを使用して呼び出しているか、指定されている場合は10.0.0.1の入力されたIFADDR構造体を使用して呼び出しています。エラーはスローされないため、機能することが期待されます。

何か案は?私は壁を上って行き、これを解決したいだけです。私はライブラリの非同期性が本当に好きなので、それを捨てたくありません。

4

1 に答える 1

0

私はあなたがしなければならないと思います

  1. マシン上のすべてのネットワークインターフェイスのリストを取得し、
  2. インターフェイスごとに、ソケットを作成してインターフェイスアドレスにバインドします。
  3. インターフェイスごとに1つずつ、すべてのソケットで送受信します。

パート1は、たとえばgetifaddrs()(ターミナルで「mangetifaddrs」と入力)で実行できます。CoreFoundationに使いやすい関数もあるかどうかはわかりません。

于 2012-10-09T20:29:41.667 に答える