2012-10-06 66 views
10

Tôi đang cố gắng tạo kết nối socket TCP đến địa chỉ IP. Tôi có thể thực hiện việc này bằng cách phân tích trực tiếp địa chỉ IP như sau:Giải quyết địa chỉ IP từ DNS trong C#

IPAddress ipAddress = IPAddress.Parse("192.168.1.123"); 
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 80); 
// Create a TCP/IP socket. 
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // This works! 

Tuy nhiên, tôi không thể tìm ra cách để divine địa chỉ IP này từ chuỗi DNS. Tôi đã thử mọi sự kết hợp của những điều sau đây:

IPAddress ipAddress = Dns.Resolve("www.mydns.org"); // No dice 
IPAddress ipAddress = Dns.GetHostEntry("www.mydns.org"); // Nada 
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org")); // So many errors... 
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org").toString()); // WTh is this attempt anyway? 

bất kỳ của bạn loại linh hồn sẽ có một mẹo để giúp tôi bóp một IPAddress ra khỏi một DNS?

Trả lời

12
foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org")) 
{ 
    Console.WriteLine(ip.ToString()); 
} 

hoặc chỉ đơn giản là IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0]; nếu bạn chỉ muốn người đầu tiên.

+0

Bạn thưa ông, là một thuật sĩ. Cảm ơn bạn. – Nanomurf

2
IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com"); 
foreach (IPAddress addr in entry.AddressList) 
{ 
    // connect, on sucess call 'break' 
} 

Đơn giản chỉ cần liệt kê địa chỉ bằng cách gọi GetHostEntry, trên những thành công phá vỡ vòng

3

Tôi đã có một phương pháp khuyến nông rất gọn gàng cho chỉ đó!

Tôi xem xét rằng IPV6 có thể được trả về làm địa chỉ đầu tiên trong danh sách địa chỉ được lớp DNS trả về và cho phép bạn "ưu tiên" IPV6 hoặc IPV4 trên kết quả. Đây là lớp được tài liệu đầy đủ (chỉ với phương pháp thích hợp cho trường hợp này vì lý do ngắn gọn):

using System; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 

/// <summary> 
/// Basic helper methods around networking objects (IPAddress, IpEndPoint, Socket, etc.) 
/// </summary> 
public static class NetworkingExtensions 
{ 
    /// <summary> 
    /// Converts a string representing a host name or address to its <see cref="IPAddress"/> representation, 
    /// optionally opting to return a IpV6 address (defaults to IpV4) 
    /// </summary> 
    /// <param name="hostNameOrAddress">Host name or address to convert into an <see cref="IPAddress"/></param> 
    /// <param name="favorIpV6">When <code>true</code> will return an IpV6 address whenever available, otherwise 
    /// returns an IpV4 address instead.</param> 
    /// <returns>The <see cref="IPAddress"/> represented by <paramref name="hostNameOrAddress"/> in either IpV4 or 
    /// IpV6 (when available) format depending on <paramref name="favorIpV6"/></returns> 
    public static IPAddress ToIPAddress(this string hostNameOrAddress, bool favorIpV6=false) 
    { 
     var favoredFamily = favorIpV6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; 
     var addrs = Dns.GetHostAddresses(hostNameOrAddress); 
     return addrs.FirstOrDefault(addr => addr.AddressFamily == favoredFamily) 
       ?? 
       addrs.FirstOrDefault(); 
    } 
} 

Đừng quên đặt lớp này vào trong không gian tên! :-)

Bây giờ bạn chỉ có thể làm điều này:

var server = "http://simpax.com.br".ToIPAddress(); 
var blog = "http://simpax.codax.com.br".ToIPAddress(); 
var google = "google.com.br".ToIPAddress(); 
var ipv6Google = "google.com.br".ToIPAddress(true); // if available will be an IPV6 
Các vấn đề liên quan