どのように自分の地域-地元でのIPアドレスからudpソケット(C/C++)

StackOverflow https://stackoverflow.com/questions/29890

  •  09-06-2019
  •  | 
  •  

質問

  1. 複数ネットワークアダプタ
  2. 結合するUDPソケットへのローカルポートなしを指定することができます。
  3. 受信パケットのアダプタ

語ることはあり得ない地元の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

に提供されるソリューションによる timbo このアドレスの範囲はとてもユニークだとは重ならない.これは通常の場合ではない汎用的な解決策です。

がありましたが実施する機能は何だ後にスティーブンの著書"Unixネットワークプログラミング"節(20.2) この機能に基づくrecvmsg()によrecvfrom().の場合ソケットのIP_RECVIFオプションを有効にしrecvmsg()を返します。indexにインターフェースのパケットをいただきました。このために使用することができの宛先アドレスです。

ソースコードをご用意 こちらの.この機能であるという'recvfrom_flags()'

残念ながらの送とrecvfrom APIコールは基本的に壊れて使用した場合のソケットに"ド"になってしまっているのない分野のための地元のIP情報です。

では何ができるだけているのでしょうか?

  1. ですね(例に基づくルーティング。
  2. 一覧を取得できる地元のアドレスな結合する別のソケットは各地域のアドレスです。
  3. 利用できる新しい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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top