2012-04-24 19 views
6

Tôi đang cố viết một chương trình bằng Sockets và tôi cần lấy địa chỉ IP cục bộ của mình.getLocalAddress() trả về 0.0.0.0

Khi tôi sử dụng getLocalAddress trong socket, tôi chỉ nhận được 0.0.0.0.

Đây là một mảnh nhỏ của mã của tôi:

DatagramSocket socket; 
DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500); 
socket = new DatagramSocket(); 
System.out.println("Local address = " + socket.getLocalAddress()); 
socket.send(pacoteEnvio); 

Bạn có bất cứ ý tưởng?

Tôi đang sử dụng UDP, vì vậy tôi không chắc liệu tôi có thể nhận IP của mình theo cách này vì nó không có kết nối, nhưng tôi nghĩ bạn có thể giúp tôi!

+0

Ổ cắm của bạn không bị ràng buộc, giải thích 0 0 0 0 địa chỉ – GETah

+0

Tôi đã cố gắng để ràng buộc nó cho một thử nghiệm, nhưng tôi nhận được thông báo: Nó đã bị ràng buộc .. – fhbeltrami

Trả lời

4

Bạn có thể thử:

InetAddress ip = InetAddress.getLocalHost();

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html

DatagramSocket công cộng (int port, InetAddress laddr) ném SocketException

Tạo một ổ cắm datagram, ràng buộc với địa chỉ địa phương quy định. Cổng địa phương phải nằm trong khoảng từ 0 đến 65535. Nếu địa chỉ IP là 0.0.0.0, socket sẽ bị ràng buộc vào địa chỉ ký tự đại diện, một địa chỉ IP được chọn bởi hạt nhân.

+0

nó không hoạt động ... tôi đã thử quá – fhbeltrami

+0

nó hoạt động. Cảm ơn người đàn ông – fhbeltrami

0

Trong khi DatagramSocket không được kết nối, nó không ràng buộc bất kỳ cổng nào trên máy cục bộ để IP là 0.0.0.0. Hãy thử kết nối với socket.connect(SocketAddress addr) và sau đó bạn sẽ nhận được kết quả đúng. Bạn sẽ nhận được cùng địa chỉ IP 0.0.0.0 sau phương thức socket.disconnect().

+0

Nhưng tôi đang phát sóng, vì vậy tôi không có bất kỳ địa chỉ nào để kết nối. – fhbeltrami

+0

thử kết nối với máy chủ cục bộ (tìm một cổng miễn phí tại đó) –

5

Lấy địa chỉ cục bộ bằng các cơ chế như thế này thường không hoạt động theo cách bạn mong đợi. Hệ thống thường có ít nhất hai địa chỉ - 127.0.0.1ip address of nic, khi bạn liên kết với địa chỉ để nghe, bạn có liên kết với INADDR_ANY, giống như địa chỉ 0.0.0.0 tương tự như ràng buộc với 127.0.0.1ip address of nic. Hãy xem xét một máy tính xách tay với một card mạng có dây và không dây - một trong hai hoặc cả hai có thể được kết nối cùng một lúc. Mà sẽ được coi là địa chỉ IP của hệ thống trong trường hợp này?

Tôi đã đánh cắp một tập con của câu trả lời cho enumerating the ip addresses of all enabled NIC cards, đề cập đến địa chỉ của tất cả các NIC, liệt kê địa chỉ IP cho tất cả các giao diện, trên hệ thống của tôi Các địa chỉ IP.

try { 
    System.out.println("Full list of Network Interfaces:"); 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
     NetworkInterface intf = en.nextElement(); 
     System.out.println(" " + intf.getName() + " " + intf.getDisplayName()); 
     for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
      System.out.println("  " + enumIpAddr.nextElement().toString()); 
     } 
    } 
} catch (SocketException e) { 
    System.out.println(" (error retrieving network interface list)"); 
} 

Nói chung, tuy nhiên nếu bạn đang lập trình máy chủ, khi bạn nhận được một gói tin trên một dịch vụ UDP, nó chứa địa chỉ IP của người gửi, mà bạn chỉ đơn giản là gửi response tới, và máy tính là đủ thông minh để gửi nó ra khỏi giao diện mạng chính xác.

2

Các javadoc cho DatagramSocket.getLocalAddress() nói này

Returns - địa chỉ địa phương mà các ổ cắm được ràng buộc, null nếu ổ cắm được đóng lại, hoặc một InetAddress đại diện cho địa chỉ wildcard nếu một trong hai ổ cắm không bị ràng buộc, hoặc phương thức quản lý bảo mật checkConnect không cho phép thao tác.

Nếu bạn tạo một DatagramSocket sử dụng các nhà xây dựng không args, bạn nhận được một ổ cắm mà không bị ràng buộc, và do đó (theo javadoc) getLocalAddress() nên trả lại ký tự đại diện địa chỉ IP 0.0.0.0. Và nó có.

Thật đáng ngạc nhiên những gì bạn có thể học bằng cách đọc các tài liệu hướng dẫn :-)

2

Tôi đang làm việc trên một dự án tương tự - một dự án người đàn ông client bellford. Tôi đã thử cách của bạn lúc đầu và đã nhận 0.0.0.0 quá. Sau đó, tôi đã tìm ra nó bằng cách chỉ sử dụng một phương thức của InetAddress để xuất địa chỉ dưới dạng một chuỗi - mà không cần liên quan đến socket datagram.

String localIP = InetAddress.getLocalHost().getHostAddress(); 
System.out.println(localIP); 

Và tôi đã hiển thị IP nội bộ của mình - IP được gán cho bộ định tuyến của tôi. Đó là đủ cho tôi. Hi vọng điêu nay co ich.