6

ソケットを使用してプログラムを作成しようとしていますが、自分のローカル IP アドレスを取得する必要があります。

ソケットで getLocalAddress を使用すると、0.0.0.0 しか取得できません。

これが私のコードの一部です:

DatagramSocket socket;
DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500);
socket = new DatagramSocket();
System.out.println("Local address = " + socket.getLocalAddress());
socket.send(pacoteEnvio);

何か考えはありますか?

私はUDPを使用しているので、コネクションレスであるため、この方法でIPを取得できるかどうかはわかりませんが、助けてくれると思います!

4

5 に答える 5

6

このようなメカニズムを使用してローカルアドレスを取得することは、通常、期待どおりに機能しません。システムには通常、少なくとも2つのアドレスがあります。リスニング用のアドレスにバインドする127.0.0.1ip address of nic、とにバインドするのと同じアドレス0.0.0.0と同じINADDR_ANYにバインドすることに127.0.0.1 なり ip address of nicます。有線および無線のネットワークカードを備えたラップトップを考えてみましょう。どちらかまたは両方を同時に接続できます。この場合、どちらがシステムのIPアドレスと見なされますか?

有効なすべてのNICカードのIPアドレスを列挙するための回答のサブセットを盗みました。これは、すべてのNICのアドレスを処理し、すべてのインターフェイスのIPアドレスを一覧表示します。私のシステムでは、10個のインターフェイスがあるため、最終的にはたくさんのIPアドレスを持っています。

try {
  System.out.println("Full list of Network Interfaces:");
  for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
      NetworkInterface intf = en.nextElement();
      System.out.println("    " + intf.getName() + " " + intf.getDisplayName());
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
          System.out.println("        " + enumIpAddr.nextElement().toString());
      }
  }
} catch (SocketException e) {
  System.out.println(" (error retrieving network interface list)");
}

一般に、サーバープログラミングをしている場合、UDPサービスでパケットを受信すると、送信者のIPアドレスが含まれます。このアドレスに応答を送信するだけで、コンピューターは適切なネットワークインターフェイスからパケットを送信するのに十分な機能を備えています。 。

于 2012-04-24T13:57:06.463 に答える
5

私は同様のプロジェクトに取り組んでいます-ベルフォードマンクライアントプロジェクトです。私は最初にあなたのやり方を試してみましたが、0.0.0.0も得ました。次に、データグラムソケットを使用せずに、InetAddress のメソッドを使用してアドレスを文字列として出力するだけで、それを理解しました。

String localIP = InetAddress.getLocalHost().getHostAddress();
System.out.println(localIP);

そして、内部 IP を表示しました。これは、ルーターに割り当てられた IP です。私にはそれで十分でした。お役に立てれば。

于 2014-12-10T21:40:45.657 に答える
4

あなたが試すことができます :

InetAddress ip = InetAddress.getLocalHost();

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html

public DatagramSocket(int port、InetAddress laddr)はSocketExceptionをスローします

指定されたローカルアドレスにバインドされたデータグラムソケットを作成します。ローカルポートは0〜65535である必要があります。IPアドレスが0.0.0.0の場合、ソケットは、カーネルによって選択されたIPアドレスであるワイルドカードアドレスにバインドされます。

于 2012-04-24T13:12:55.863 に答える
2

のjavadocはこれをDatagramSocket.getLocalAddress()言います

null戻り値 -ソケットが閉じられている場合はソケットがバインドされているローカル アドレス、ソケットがバインドされていない場合、またはセキュリティ マネージャーのメソッドで操作が許可されていないInetAddress場合は、ワイルドカード アドレスを表します。checkConnect

引数なしのコンストラクターを使用してを作成するDatagramSocketと、バインドされていないソケットが取得されるため、(javadoc に従って)getLocalAddress()ワイルドカード IP アドレスを返す必要があります0.0.0.0。そして、そうです。

ドキュメントを読むことで学べることは驚くべきことです:-)

于 2012-04-24T15:17:19.650 に答える
0

DatagramSocket が接続されていない間、ローカル マシンのポートはバインドされないため、IP は 0.0.0.0 です。接続を試みるとsocket.connect(SocketAddress addr)、正しい結果が得られます。socket.disconnect()メソッドの後に同じ 0.0.0.0 IP アドレスを取得します。

于 2012-04-24T13:19:05.080 に答える