在端口53上的C中获取DNS查询。要绑定的地址是什么?

时间:2017-03-26 18:20:40

标签: c sockets proxy dns

我在C中构建一个简单的DNS代理服务器,必须在端口53上接收来自DNS客户端(将使用UDP)的请求,将查询转发到其他服务器,从服务器获取响应并发送回到客户端。

我已尝试从this answer实施伪代码,但我一直坚持接收查询。

#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>

#define ERROR -1

void    error_die(char *err_msg)
{
    perror(err_msg);
    exit(-1);
}

int     main(int argc, char **argv)
{
    int                 sockfd;
    struct sockaddr_in  servaddr;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == ERROR)
        error_die("socket");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(53);
    inet_aton("192.168.0.1", &(servaddr.sin_addr));

    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof servaddr) == ERROR)
        error_die("bind");
    return (0);
}

&#34; 192.168.0.1&#34;是/etc/resolv.conf中找到的DNS服务器的地址。运行后,我得到了&#34; bind:无法分配请求的地址&#34; 。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您应该将bind与您的地址一起使用,而不是使用远程地址。可以使用INADDR_ANY

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

如果您需要接收数据包,请使用recvfrom。在调用select之前,您还可以使用recvfrom检查是否有可用的数据包。