1

我尝试学习 TCP/IP,作为练习,我开发了一个 LAN 主机发现实用程序,例如http://overlooksoft.com

爬网后,我找到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

UDP 不能那样工作。除非那些其他机器上的某些东西绑定到 UDP 端口 80 并做出响应,否则什么都不会发生。数据报只是丢失了。其他机器可能会发送 ICMP“端口不可达”消息,但由于您无法真正连接到广播地址,因此在 UDP 级别您什么也得不到。

如果您不想在其他机器上部署任何东西,那么ICMP可能是您的最佳选择。否则请查看多播,也许还有zeroconf

于 2012-10-23T21:31:05.217 回答
1

如果您想集成 Java 和 Nmap,请尝试使用 Nmap4j (http://nmap4j.sourceforge.net)。它是一个围绕 nmap 的包装 API,允许您访问从 Java 对象中的 nmap 返回的数据。

于 2012-10-23T23:23:02.117 回答