1

私は TCP/IP を学ぼうとしており、演習としてhttp://overlooksoft.comのような LAN ホスト検出ユーティリティを開発しました。

ウェブをクロールした後、nmapこの仕事をするユーティリティを見つけました。

私はこの小さなテストを行いました:

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class NetDiscovery {
   public static void main( String[] args ) throws Throwable {
      DatagramChannel channel = DatagramChannel.open();
      channel.bind(
         new InetSocketAddress( InetAddress.getByName( "192.168.1.7" ), 2416 ));
      ByteBuffer      buffer  = ByteBuffer.allocate( 1024 );
      SocketAddress   address =
         new InetSocketAddress( InetAddress.getByName( "192.168.1.255" ), 80 );
      channel.send( buffer, address );
      SocketAddress sender = channel.receive( buffer ); // <<<<<<<<<<<<<<<<<<<<
      System.err.println(
         ((InetSocketAddress)sender).getAddress().getHostAddress());
   }
}

LAN 上の他のホスト (4) によるこの「udp ping ブロードキャスト」への応答を期待していますが、このプログラムは でマークされた行で無期限に待機します。// <<<<<<<<<<<<<<<<<<<<

なんで?

4

2 に答える 2

1

Java と Nmap を統合する場合は、Nmap4j (http://nmap4j.sourceforge.net) を使用してみてください。これは、nmap から返されたデータに Java オブジェクトでアクセスできるようにする、nmap のラッパー API です。

于 2012-10-23T23:23:02.117 に答える
1

UDP はそのようには機能しません。それらの他のマシンの何かが UDP ポート 80 にバインドされていて応答しない限り、何も起こりません。データグラムが失われるだけです。他のマシンはおそらく ICMP の「port unreachable」メッセージを送信しますが、実際にはブロードキャスト アドレスに接続できないため、UDP レベルでは何も得られません。

他のマシンに何も展開したくない場合は、おそらくICMPが最適なオプションです。それ以外の場合は、マルチキャストとおそらくzeroconfを調べてください。

于 2012-10-23T21:31:05.217 に答える