2010-01-11 39 views
8

Tôi có một số mã trong một ứng dụng asp.net mà needsto có được địa chỉ ipv4 của máy khách (người dùng là tất cả trên mạng riêng của chúng tôi). Gần đây, chúng tôi đã nâng cấp máy chủ ứng dụng chạy trên máy chủ Windows 2008. Bây giờ mã Request.UserHostAddress trả về ipv4 khi máy khách đang ở trên một hệ điều hành cũ và ipv6 khi họ đang ở trên một hệ điều hành mới hơn (Vista và cao hơn). Vì vậy, tính năng dựa trên công việc này cho một số khách hàng chứ không phải cho những người khác.Vấn đề Chuyển đổi ipv6 thành ipv4

Tôi đã thêm mã được cho là chuyển đổi từ ipv6 thành ipv4 để cố khắc phục sự cố này. Đó là từ hướng dẫn trực tuyến này: http://www.4guysfromrolla.com/articles/071807-1.aspx .I'm sử dụng dsn.GetHostAddress và sau đó lặp qua IP trả về có tìm kiếm một trong đó là "Internetwork"

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress)) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

if (IP4Address != String.Empty) 
{ 
    return IP4Address; 
} 


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

return IP4Address; 

Vấn đề là điều này không làm việc cho tôi. Các khách hàng kết nối từ ipv4 tiếp tục trả lại IP ip4 chính xác của máy khách, nhưng các máy khách kết nối từ Vista và Windows 7 nó sẽ trả lại IP ip4 của máy SERVER không phải máy khách.

+8

Tôi đã nhìn thấy mã mẫu này được lặp lại trên nhiều blog. Tôi ngạc nhiên vì nó quá sai .. phần 1, lấy địa chỉ IP của khách hàng. Nếu không thành công, hãy trả lại địa chỉ IP của máy chủ. wtf?!? –

+4

Đúng, chỉ tìm thấy ví dụ tương tự ở đây: http://www.4guysfromrolla.com/articles/071807-1.aspx. Nếu không có gì khác, bằng cách sử dụng 'ToString()' để kiểm tra sự bình đẳng enum trông giống như nó được viết bởi một tổng newbie .NET. – Groo

Trả lời

7

Câu trả lời đơn giản: Tắt IPV6 trên máy chủ hoặc xóa địa chỉ IPV6 của máy chủ khỏi mục nhập DNS.

Không có bộ chuyển đổi IPV4 < -> IPV6 phép thuật. Chúng là các giao thức hoàn toàn khác nhau và địa chỉ trong một giao thức không dịch sang giao thức kia. Nếu bạn muốn truy xuất địa chỉ IPV4 của máy khách một cách đáng tin cậy, bạn cần đảm bảo rằng máy khách kết nối qua IPV4.

+6

Và tất nhiên là những lời khuyên rõ ràng: IPv6 đang đến, chuẩn bị phần mềm của bạn để xử lý nó đúng cách. Dựa vào địa chỉ IPv4 sẽ làm tổn thương bạn. –

1

nếu bạn đang sử dụng Net 4.5 Khung sau đó là một phương pháp cung cấp để chuyển đổi IP6 để IP4

public IPAddress MapToIPv4() 

Bạn có thể tìm thấy những thông tin chi tiết here

+4

Phương pháp đó chỉ có ý nghĩa khi sử dụng trên các địa chỉ IPv6 đã thu được bằng cách ánh xạ địa chỉ IPv4 đến v6 ngay từ đầu. Như Jesse Weigert nói, không có công cụ chuyển đổi v6 -> v4. – AakashM

6

Tôi cũng đã sao chép mã ví dụ và một đồng nghiệp chỉ ra rằng nó rõ ràng là lỗi. dòng này sử dụng tên máy chủ của máy chủ, do đó kết quả không chính xác:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 

tôi đã sửa chữa các mã trong dự án của tôi như sau:

/// <summary> 
/// Returns the IPv4 address of the specified host name or IP address. 
/// </summary> 
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param> 
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns> 
public static string GetIPv4Address(string sHostNameOrAddress) 
{ 
    try 
    { 
    // Get the list of IP addresses for the specified host 
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress); 

    // First try to find a real IPV4 address in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
     return ipHost.ToString(); 

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
    if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) 
     { 
     IPHostEntry ihe = Dns.GetHostEntry(ipHost); 
     foreach (IPAddress ipEntry in ihe.AddressList) 
      if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      return ipEntry.ToString(); 
     } 
    } 
    catch (Exception ex) 
    { 
    System.Diagnostics.Trace.WriteLine(ex); 
    } 
    return null; 
} 

Đoạn mã trên làm việc trong ASP.Net 2.0 trên Windows 7/Server 2008. Hy vọng điều này sẽ hữu ích.

+0

không phải là người hâm mộ của dấu ngoặc vuông? :) – Evorlor

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