我尝试学习 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 广播”做出一些响应,但该程序在标有 // <<<<<<<<<<<<<<<<<<<<
的行中无限期地等待
为什么?
最佳答案
UDP 不是这样工作的。除非其他机器上的某些东西绑定(bind)到 UDP 端口 80 并做出响应,否则什么都不会发生。数据报就丢失了。其他机器可能会发送 ICMP“端口无法访问”消息,但由于您无法真正连接到广播地址,因此您在 UDP 级别上什么也得不到。
如果您不想在其他计算机上部署任何内容,则 ICMP可能是您最好的选择。否则请查看 multicast也许zeroconf .
关于java - 局域网内的外部主机无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039233/