コールバックを使用してサード パーティのライブラリを介して複数のマルチキャスト フィードにサブスクライブしているクライアントがあります。サードパーティのライブラリは次のようなことを行います:
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_addr
sockaddr_in*
recvfrom
he->h_addr_list
he->h_addr_list
s_addr