2012-10-23 26 views
1

我嘗試學習TCP/IP,並且作爲練習,我開發了一個局域網主機發現實用程序,如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廣播」一些響應

爲什麼?

+0

那些其他主機是否有任何監聽和回覆UDP端口80? –

+0

不,我試圖發現我的局域網像http://overlooksoft.com那樣。也許我應該使用ICMP? – Aubin

回答

1

UDP不能像那樣工作。除非那些其他機器上的東西被綁定到UDP端口80,並且響應,否則什麼都不會發生。數據報只是丟失。其他機器可能會發送ICMP「端口不可達」消息,但由於您無法真正連接到廣播地址,因此您無法在UDP級別進行任何操作。

如果你不想在其他機器上部署任何東西,那麼ICMP可能是你最好的選擇。否則看看multicastzeroconf

1

如果您想要集成Java和Nmap,請嘗試使用Nmap4j(http://nmap4j.sourceforge.net)。它是一個圍繞nmap的包裝API,允許您訪問Java對象中從nmap返回的數據。

+0

謝謝。主要目標是深入學習TCP/IP。我會嘗試在C/C++中編寫代碼,並最終在Java/JNI中編譯,如果下週將下雨...... ;-) – Aubin

+0

我不是專家,但我確實知道C/C++會更好遵循路線以便對TCP/IP有很好的理解。 NMap是用其中一種寫的,因爲你需要訪問在Java中無法輕鬆訪問的操作系統庫(這可能是可能的,但比在C/C++中完成操作要困難)。祝你好運! – Jon