java - 局域网内的外部主机无响应

标签 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());
   }
}

我期望 LAN 上的其他主机 (4) 对此“udp ping 广播”做出一些响应,但该程序在标有 // <<<<<<<<<<<<<<<<<<<< 的行中无限期地等待

为什么?

最佳答案

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

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

关于java - 局域网内的外部主机无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039233/

相关文章:

erlang - 如何构建 Erlang OTP UDP 服务器

flutter - 是否可以通过 UDP/TCP 从 flutter 应用程序向 .NET 应用程序发送消息?

perl - 通过UDP发送数据包

java - 为什么这个方法返回null? (从数组中调用一组字符串)

sockets - C++ Winsock 非阻塞/异步 UDP 套接字

java - Scala 是否有可能在不更改 JVM 的情况下实现泛型?

sockets - Netty是否支持通过UNIX域套接字的数据报包?

php - SMTP -> 错误 : Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (0)

java - 尝试从在某些标签之间读取的缓冲读取器中提取子字符串

Java/从 Observable<List<String>> 转换为 List<String>