我尝试学习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”做出一些响应,但此程序会在标有// <<<<<<<<<<<<<<<<<<<<
为什么?
答案 0 :(得分:1)
UDP不能那样工作。除非那些其他机器上的东西绑定到UDP端口80,并且响应,否则什么都不会发生。数据报刚刚丢失。其他机器可能发送ICMP“端口无法访问”消息,但由于您无法真正连接到广播地址,因此您无法在UDP级别获得任何内容。
如果您不希望在其他计算机上部署任何内容,那么ICMP可能是您的最佳选择。否则请查看multicast,也许zeroconf。
答案 1 :(得分:1)
如果要集成Java和Nmap,请尝试使用Nmap4j(http://nmap4j.sourceforge.net)。它是围绕nmap的包装器API,允许您访问Java对象中从nmap返回的数据。