在局域网中没有外部主机的响应

时间:2012-10-23 21:05:45

标签: java sockets udp

我尝试学习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());
   }
}

我希望我的局域网上的其他主机(4)能够对此“udp ping broadcast”做出一些响应,但此程序会在标有// <<<<<<<<<<<<<<<<<<<<

的行中无限期等待

为什么?

2 个答案:

答案 0 :(得分:1)

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

如果您不希望在其他计算机上部署任何内容,那么ICMP可能是您的最佳选择。否则请查看multicast,也许zeroconf

答案 1 :(得分:1)

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