对于一个项目,我正在编写一个简单的类似dig的工具,用于发送DNS请求和处理响应。我正在使用C#UdpClient发送数据包。现在,我可以正常发送到任何IPv4服务器,但是当我尝试指定IPv6 DNS(2001:4860:4860:0:0:0:0:8888或2001:4860:4860:0:0:0:0:0 :8844)我收到错误消息。
我的代码是:
try {
var ip = "[dns ip]";
var DNSServer = IPAddress.Parse(ip);
var endpoint = new IPEndPoint(DNSServer, 53);
byte[] packet = new byte[UDP_LENGTH];
var index = createRequest(type, hostname, packet);
client.Send(packet, index, endpoint);
var result = client.Receive(ref endpoint);
ParseResponse(result);
}
catch(Exception e){
Console.WriteLine(e.ToString());
Environment.Exit(0);
}
如果ip == 8.8.8.8
或任何其他IPv4地址,它们都按预期运行。如果得到ip == 2001:4860:4860::8844
或其他任何IPv6,
System.Net.Sockets.SocketException (10051): A socket operation was attempted to an unreachable network
at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP)
at System.Net.Sockets.UdpClient.Send(Byte[] dgram, Int32 bytes, IPEndPoint endPoint)
at Program.queryDNS(IPAddress DNSServer, DnsType type, String hostname) in C:\...\Program.cs:line 66
答案 0 :(得分:1)
尝试对不可达的网络进行套接字操作
很可能您没有与要访问的网络的IPv6连接。这可能是因为本地网络中没有IPv6,没有IPv6网关,没有在路由器上具有公共IPv6地址...。像dig这样的其他工具在同一台计算机上调用时也应显示相同的行为,即与您的代码无关。