どのように自分の地域-地元でのIPアドレスからudpソケット(C/C++)
質問
- 複数ネットワークアダプタ
- 結合するUDPソケットへのローカルポートなしを指定することができます。
- 受信パケットのアダプタ
語ることはあり得ない地元のipアドレスのアダプターを受けるパケット?
それでは、"ipアドレスからの受信アダプター?"のアドレスから送信したの
receive_from( ..., &senderAddr, ... );
ます。
解決
きを列挙すべてのネットワークアダプタ、IPアドレスを比較し、一部のサブネットマスクを送信者のアドレスです。
のように:
IPAddress FindLocalIPAddressOfIncomingPacket( senderAddr )
{
foreach( adapter in EnumAllNetworkAdapters() )
{
adapterSubnet = adapter.subnetmask & adapter.ipaddress;
senderSubnet = adapter.subnetmask & senderAddr;
if( adapterSubnet == senderSubnet )
{
return adapter.ipaddress;
}
}
}
他のヒント
G家庭,
なっているのでしょうかすっごbindを使用INADDR_ANYを指定します。
そのような場合には、その意味INADDR_ANYはUDPソケットが作成したポート上の指定されたすべてのインタフェースソケットはすべてのパケットを送信する全てのインタフェースのポートを指定します。
送信時にこのソケットの番インタフェースは使用します。送信送信者のアドレスは設定のIPアドレスと発信のインターフェース.
初の送信インタフェース定義としての配列の場合の効果に変わりはありませんifconfig-a.では、そeth0.
HTH.
声で Rob
残念ながらの送とrecvfrom APIコールは基本的に壊れて使用した場合のソケットに"ド"になってしまっているのない分野のための地元のIP情報です。
では何ができるだけているのでしょうか?
- ですね(例に基づくルーティング。
- 一覧を取得できる地元のアドレスな結合する別のソケットは各地域のアドレスです。
- 利用できる新しいApiを支援する。ある部品、まず使用にはrelaventソケットオプション(ip_recvifのためのIPv4ipv6_recvif IPv6)のスタックしたい。そしておいて異なる機能(recvmsg linuxおよびその他のunix系システムWSArecvmsg windows)を受けるのです。
これらのオプションです。推測することは明らかを間違った答えsoemtimes.結別のソケット増加は、複雑なアプリを作成できるソフトウェアとの問題が起きた場合のリストには地元のアドレスの変更プログラムが走っています。の新しいApiのtechical soloutionが削減可搬性 特にこのように見えWSArecvmsgではご利用いただけませんwindows XPの場合) が必要とされる場合があり変更のソケットのラッパーの図書館されています。
編集のようになったので間違っているようで、MSの文書は誤解を招くことになるWSArecvmsgは行わないものとします。見 https://stackoverflow.com/a/37334943/5083516
ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len); ssize_t recvmsg(int socket, struct msghdr *message, int flags); [..] If address is not a null pointer and the socket is not connection-oriented, the source address of the message is filled in.
実際のコード:
int nbytes = recvfrom(sock, buf, MAXBUFSIZE, MSG_WAITALL, (struct sockaddr *)&bindaddr, &addrlen);
fprintf(stdout, "Read %d bytes on local address %s\n", nbytes, inet_ntoa(bindaddr.sin_addr.s_addr));
武器agiは、dexで下がらないboxerぐ.
してみてください:
gethostbyname("localhost");