【问题标题】:DNS Client that is written Using C Sockets使用 C 套接字编写的 DNS 客户端
【发布时间】:2010-03-04 21:26:15
【问题描述】:

我只想使用 C 套接字编写 DNS 客户端程序 接受三个参数:一个查询名称(例如,主机名或域名)和一个查询类型(A、或 NS 或 MX),以及 DNS 服务器名称。打印收到的 DNS 记录的答案部分中的响应。

我知道有一个命令getaddrinfo.. 但我只想连接到查找表然后 获取 DNS 服务器名称...

所以当我输入 ./a.out www.google.com A 144.20.190.70

它会显示类似这样的内容:

服务器:144.20.190.70 地址:144.20.190.70#53

非权威回答:

名称:www.google.com

规范名称:www.l.google.com

名称:www.l.google.com 地址:74.125.19.104

名称:www.l.google.com 地址:74.125.19.105

名称:www.l.google.com 地址:74.125.19.106

名称:www.l.google.com 地址:74.125.19.147

名称:www.l.google.com 地址:74.125.19.99

名称:www.l.google.com 地址:74.125.19.103

【问题讨论】:

  • 你需要把问题问得更清楚。你不想做 getaddrinfo;从这个问题中可以清楚地看出这一点,但是“dns srname”呢?您可能应该考虑重新表述这个问题。

标签: sockets


【解决方案1】:

是的,您需要查看 Rob-philpott 为 .net 制作的 Bev.net.dns 类

Click Here

构建发送到 DNS 服务器的请求并不容易,但是一旦您可以从服务器获得答案,那么您需要将其发送回浏览器,这是我一直坚持的一点。

我在端口 53/UDP 上侦听并获取请求并将其发送到 DNS 服务器并获得有效响应,然后我使用远程客户端端口作为 UDP 将其发送回浏览器,但浏览器不会除了回复。

Robs 代码非常易于使用,如下所示“Resolver.Lookup”,我只需要添加一点,以便从 DNS 服务器发送的原始字节数组保存在 Resolver.Message 中,准备好发送回浏览器.

    public void Listen()
    {
        receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
        receiveEndPoint = new IPEndPoint(IPAddress.Any, receivePort); receiveSocket.Bind(receiveEndPoint); 
        receivePort = (receiveSocket.LocalEndPoint as IPEndPoint).Port; 
        receiveBuffer = new byte[BufferSize]; 
        receiveAsyncResult = receiveSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref receiveEndPoint, new AsyncCallback(NetworkMessageReceivedCallback), receiveSocket);
    }


    public void NetworkMessageReceivedCallback(IAsyncResult asyncResult)
    {
        EndPoint remoteEndPoint = null;            
        byte[] bytes = null;                        
        remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //Will contain the clients port                
        int bytesRead = receiveSocket.EndReceiveFrom(asyncResult, ref remoteEndPoint);                                              
        bytes = new Byte[bytesRead];                
        Buffer.BlockCopy(receiveBuffer, 0, bytes, 0, bytesRead);
       //string ip = "208.67.222.222";
       string ip = "192.168.1.254";
       IPAddress dnsServer = IPAddress.Parse(ip);
       Response R = Resolver.Lookup(bytes, dnsServer);
       receiveSocket.SendTo(R.Message , remoteEndPoint);//127.0.0.1
       receiveSocket.Close();
   Listen();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2019-01-17
    • 1970-01-01
    • 2021-11-14
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多