2008-12-11 44 views
25

Trong ứng dụng .NET, làm thế nào tôi có thể xác định giao diện mạng nào được sử dụng để giao tiếp với một địa chỉ IP đã cho?Xác định giao diện mạng đang hoạt động

Tôi đang chạy trên các máy trạm có nhiều giao diện mạng, IPv4 và v6 và tôi cần lấy địa chỉ của giao diện "đúng" được sử dụng cho lưu lượng truy cập đến máy chủ cơ sở dữ liệu đã cho của tôi.

Trả lời

31

Cách đơn giản nhất sẽ là:

UdpClient u = new UdpClient(remoteAddress, 1); 
IPAddress localAddr = ((IPEndPoint)u.Client.LocalEndPoint).Address; 

Bây giờ, nếu bạn muốn networkinterface đối tượng bạn làm điều gì đó như:


foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    IPInterfaceProperties ipProps = nic.GetIPProperties(); 
    // check if localAddr is in ipProps.UnicastAddresses 
} 


Một lựa chọn khác là sử dụng P/Invoke và gọi GetBestInterface() để lấy chỉ mục giao diện, sau đó lặp lại tất cả các giao diện mạng. Như trước đây, bạn sẽ phải đào qua GetIPProperties() để truy cập thuộc tính IPv4InterfaceProperties.Index).

+2

sau khi một số nghiên cứu Tôi đang tìm kiếm câu trả lời "tốt nhất" có nghĩa là: 1. IP đầu tiên của bộ điều hợp với kết hợp tuyến đường/cổng kết hợp mặc định có chỉ số thấp nhất. 2. Trong trường hợp có hệ mét, bộ điều hợp có thứ tự ràng buộc thấp nhất sẽ thắng. – halr9000

+3

sử dụng chương trình phát sóng, LocalEndPoint luôn là 0.0.0.0:broadcastPort ... –

3

Thông tin bạn đang theo dõi sẽ có trong WMI.

Ví dụ này sử dụng WMI có thể giúp bạn có được hầu hết các cách:

using System.Management; 
string query = "SELECT * FROM Win32_NetworkAdapterConfiguration"; 
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query); 
ManagementObjectCollection moCollection = moSearch.Get();// Every record in this collection is a network interface 
foreach (ManagementObject mo in moCollection) 
{  
    // Do what you need to here.... 
} 

Lớp Win32_NetworkAdapterConfiguration sẽ cung cấp cho bạn thông tin về cấu hình của adapter của bạn ví dụ địa chỉ ip, vv

Bạn cũng có thể truy vấn các lớp Win32_NetworkAdapter để tìm hiểu 'static'about mỗi bộ chuyển đổi (tốc độ tối đa, sản xuất vv)

1

Ít nhất bạn có thể bắt đầu với điều đó, cho bạn tất cả các địa chỉ từ dns cho máy địa phương.

IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName); 

foreach (System.Net.IPAddress address in hostEntry.AddressList) 
{ 
    Console.WriteLine(address); 
} 
4

Không thực sự sẽ cung cấp cho OP thông tin mà anh ấy đang tìm kiếm - anh ấy muốn biết giao diện nào sẽ được sử dụng để đến đích nhất định. Một cách để thực hiện những gì bạn muốn là giải quyết các lệnh tuyến bằng cách sử dụng lớp System.Diagnostics.Process, sau đó quét màn hình đầu ra. route PRINT (destination IP) sẽ giúp bạn sử dụng được một số thứ có thể sử dụng được. Đó có thể không phải là giải pháp tốt nhất, nhưng đó là giải pháp duy nhất tôi có thể cung cấp cho bạn ngay bây giờ.

2

Chỉ cần đưa ra một bức tranh hoàn chỉnh: Cách tiếp cận khác sẽ được sử dụng Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ...)

ConferenceXP bao gồm khá toàn diện chức năng gói này, làm việc với IPv4/6 và các địa chỉ multicast: https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84

+0

Đây chính là điều cần thiết – Itamar

+0

ví dụ mã đầy đủ để truy vấn bảng định tuyến bằng 'Socket.IOControl' có thể tìm thấy tại đây (http: // stackoverflow. com/a/26611456/684096) – BatteryBackupUnit

Các vấn đề liên quan