我有开源鳕鱼(这是它的链接) 访问https://github.com/jtRIPper/dns-tcp-socks-proxy/blob/master/dns_proxy.c 在鳕鱼的这一部分
while(1)
{
// receive a dns request from the client
printf("wait for a dns request from the client\n");
len = recvfrom(sock, buffer->buffer, 2048, 0, (struct sockaddr *)&dns_client, &dns_client_size);
printf("dns request received\n");
// fork so we can keep receiving requests
if (fork() != 0) { continue; }
// the tcp query requires the length to precede the packet, so we put the length there
query = malloc(len + 3);
query[0] = 0;
query[1] = len;
memcpy(query + 2, buffer->buffer, len);
// forward the packet to the tcp dns server
fprintf(LOG_FILE, "tcp query call\n");
tcp_query(query, buffer, len + 2);
// send the reply back to the client (minus the length at the beginning)
sendto(sock, buffer->buffer + 2, buffer->length - 2, 0, (struct sockaddr *)&dns_client, sizeof(dns_client));
free(buffer->buffer);
free(buffer);
free(query);
exit(0);
,recvfrom()函数不起作用,我不能继续显示“dns请求收到\ n”是什么问题?然后当我使用netstat -upan inn命令时,我看到了这个
活动互联网连接(服务器和已建立) Proto Recv-Q Send-Q本地地址外部地址状态PID /程序名称 udp 0 0 127.0.0.1:951 0.0.0.0:* 1623 / rpc.statd
udp 0 0 0.0.0.0:54721 0.0.0.0:* 2214 / avahi-daemon: udp 0 0 0.0.0.0:45085 0.0.0.0:* 1623 / rpc.statd
udp 0 0 127.0.0.1:53 0.0.0.0:* 4084 / dns_proxy
udp 0 0 0.0.0.0:68 0.0.0.0:* 1628 / dhclient
udp 0 0 0.0.0.0:111 0.0.0.0:* 1582 / rpcbind
udp 0 0 0.0.0.0:631 0.0.0.0:* 2323 / cupsd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 2214 / avahi-daemon: udp 0 0 0.0.0.0:42756 0.0.0.0:* 1628 / dhclient
udp 0 0 0.0.0.0:1900 0.0.0.0:* 3306 / minissdpd
udp 0 0 0.0.0.0:908 0.0.0.0:* 1582 / rpcbind
udp6 0 0 ::: 111 ::: * 1582 / rpcbind
udp6 0 0 ::: 34443 ::: * 1623 / rpc.statd
udp6 0 0 ::: 5353 ::: * 2214 / avahi-daemon: udp6 0 0 ::: 62844 ::: * 1628 / dhclient
udp6 0 0 ::: 54654 ::: * 2214 / avahi-daemon: udp6 0 0 ::: 908 ::: * 1582 / rpcbind
答案 0 :(得分:1)
类似的修改(在recvfrom()
之后添加printf)对我来说很好。除了打印之外,您是否对该程序进行了任何其他更改?
以下是我测试它的步骤:
顺便说一句。在您建议的地方添加printf()
会在桌面上产生大量输出,其中您有其他应用程序,如www浏览器或电子邮件客户端正在运行,所以要小心。也许您可以使用其余源使用的日志记录约定,例如
if (LOG == 1) { fprintf(LOG_FILE, "Using DNS server: %s\n", inet_ntoa(*(struct in_addr *)&remote_dns)); }
BTW2。如果您已手动创建或编辑它,请记住在运行dns_proxy之前备份/etc/resolv.conf。使用tailf“your_dns_proxy_logfile.log”来查看最新情况。
BTW3。该计划不是很强大。它泄漏了fds,string_value()
中有一个逐个,udp_listener()
执行malloc()
和memcpy()
而没有检查recvfrom()
的返回值。在我的机器上它有很多段错误。然而,似乎只是勉强起作用。
编辑以下是我对原作所做的一些更改。 https://github.com/thuovila/dns-tcp-socks-proxy/经过这些修改后,对于每个中断的recvfrom()
,它不会出现段错误。这些变化已合并到上游回购。
答案 1 :(得分:0)
可能首先没有数据可以接收。您无法看到“已收到dns请求\ n”这一事实意味着recvfrom()调用处于阻塞状态,等待接收数据。您需要调查hte发件人是否正在发送数据。接下来,您可能应该重新检查袜子是否绑定在正确的端口上。您可能希望共享发件人的代码以及发生绑定的recvfrom代码。