2

コールバックを使用してサード パーティのライブラリを介して複数のマルチキャスト フィードにサブスクライブしているクライアントがあります。サードパーティのライブラリは次のようなことを行います:

sockaddr_in senderAddr;
socklen_t len = sizeof(struct sockaddr_in);
for fd in allMulticastFeeds:
{
    recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&senderAddr, &len);    
    (*func)(buf, rc, &senderAddr, 0, stuff*);
}

いくつかのリスナーが私を購読しています。私の仕事は、buf に含まれるメッセージを解析し、購読している適切なクライアントでコールバックすることです。私にサブスクライブするクライアントが私に与えるオプションの 1 つは、ローカル ホストから送信されるメッセージを受信するかどうかです。サブスクライバーごとに異なる動作が必要になる可能性があるため、これをマルチキャストの無効化に変換することはできません。クライアントごとに、ローカル メッセージを要求したかどうかを確認し、そうでない場合は、確認できる場合にのみそれらを引き渡す必要があります。ローカルではsockaddr_inないこと。

これを行うための私のアプローチは、サービスのコンストラクターで次のことを行うことでした。

sockaddr_in self;
hostent *he;
char local[HOST_NAME_MAX];
gethostname(local, sizeof(local));
he = gethostbyname(local);

if (he)
{
    memcpy(&self.sin_addr, he->h_addr_list[0], he->h_length);
    selfAddr_ = self.sin_addr.s_addr;
}

whereselfAddr_は type のメンバー変数ですlong。次に、ネットワーク リスナーから上記のコールバックを取得したら、次のようにします。

//code to get the correct listener for this type of packet after parsing it
if (listener->AskedForLocal || selfAddr_ != s_addr)
    listener->onFoo(bla,bla);

I get from the third party library calling に含まれているのs_addrはどこですか。これは、私がテストしたときにうまくいくように見えましたが、時々失敗しているように感じます。このメソッドは信頼できませんか? もしそうなら、のすべての要素を着信に対してチェックする唯一の信頼できるメソッドですか?sin_addr.s_addrsockaddr_in*recvfromhe->h_addr_listhe->h_addr_lists_addr

4

2 に答える 2

0

サービスのコンストラクターを見て、virtualbox イメージとして実行されている Ubuntu 10.04 LTS で試してみると、selfAddr_ = 0x10107f が得られます。これはループバック アドレス 127.0.0.1 に対応します。

これはあなたが探しているものではないかもしれません-おそらく特定のネットワークインターフェースのIPアドレスを探しているのではないかと思います。もしそうなら、この回答を試してください。

お役に立てれば。

于 2013-03-14T18:17:50.517 に答える