我在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; 。我做错了什么?
答案 0 :(得分:0)
您应该将bind
与您的地址一起使用,而不是使用远程地址。可以使用INADDR_ANY
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
如果您需要接收数据包,请使用recvfrom
。在调用select
之前,您还可以使用recvfrom
检查是否有可用的数据包。