Nodejs 用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息,大家帮看看为什么?
Nodejs 用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息,大家帮看看为什么?
用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息
var dgram = require(‘dgram’); var message = new Buffer(“518601000001000000000000027a680977696b697065646961036f72670000010001”,‘hex’);
var server = dgram.createSocket(“udp4”);
server.on(“message”, function (msg, rinfo) { console.log("server got: " + msg.toString(‘hex’) + " from " + rinfo.address + “:” + rinfo.port); });
server.on(“listening”, function () { var address = server.address(); console.log("server listening " + address.address + “:” + address.port); //console.log(message); server.send(message,0,message.length,53,‘8.8.8.8’); });
server.bind(41234);
根据你提供的代码,问题可能在于使用了 dgram.createSocket("udp4")
创建了一个UDP服务器,但实际上你只是想发送一个DNS查询给Google的DNS服务器(如 8.8.8.8
),而不是创建一个监听的UDP服务器。
问题分析:
- 错误地创建了UDP服务器:你在代码中创建了一个名为
server
的UDP服务器,并且绑定了端口41234
,但实际上你只是想发送一个DNS查询。 - 监听消息事件:你在代码中设置了
message
事件处理器,但实际上你并不需要它,因为你并不想接收任何来自其他主机的消息。
解决方案:
你可以使用 dgram.createSocket("udp4")
来创建一个UDP客户端,然后发送DNS查询数据包到 8.8.8.8
的 53
端口。
const dgram = require('dgram');
// DNS 查询数据包
const dnsQuery = Buffer.from("518601000001000000000000027a680977696b697065646961036f72670000010001", 'hex');
// 创建一个UDP客户端socket
const client = dgram.createSocket("udp4");
client.on("error", (err) => {
console.error(`Server error:\n${err.stack}`);
client.close();
});
client.on("close", () => {
console.log("Client closed");
});
// 发送DNS查询数据包到Google的DNS服务器
client.send(dnsQuery, 0, dnsQuery.length, 53, "8.8.8.8", (err) => {
if (err) throw err;
console.log("DNS query sent successfully");
// 关闭客户端连接
client.close();
});
解释:
- DNS查询数据包:定义了一个变量
dnsQuery
包含了你要发送的DNS查询数据包。 - 创建UDP客户端:使用
dgram.createSocket("udp4")
创建一个UDP客户端client
。 - 错误处理:添加了
error
事件处理器来捕获并处理可能出现的错误。 - 关闭处理:添加了
close
事件处理器,在操作完成后关闭客户端连接。 - 发送DNS查询:使用
client.send()
方法将DNS查询数据包发送到8.8.8.8
的53
端口。 - 成功提示:如果发送成功,则打印一条消息。
通过这种方式,你可以确保只发送DNS查询而不创建一个监听的UDP服务器,从而解决你的问题。
你能用google dns么? 很多地方8.8.8.8被墙了吧 你换个dns试试看 比如自己isp的dns
多谢,确实是被GFW了
msg.toString(‘hex’)这个信息如何解密出来
从你的描述来看,问题可能出在使用 dgram
模块发送 UDP 数据包时的处理方式上。你创建了一个 server
对象用于监听消息,但实际上你需要的是一个客户端来发送消息。你可以使用 dgram.createSocket("udp4")
创建一个 UDP 客户端来发送 DNS 查询请求。
以下是修改后的示例代码:
const dgram = require('dgram');
// 构建DNS查询包(此处示例为向Google的公共DNS服务器发送查询)
const message = Buffer.from("518601000001000000000000027a680977696b697065646961036f72670000010001", 'hex');
// 创建UDP客户端
const client = dgram.createSocket('udp4');
client.on('error', (err) => {
console.error(`Server error:\n${err.stack}`);
client.close();
});
client.on('message', (msg, rinfo) => {
console.log(`Server got: ${msg.toString('hex')} from ${rinfo.address}:${rinfo.port}`);
client.close(); // 接收到响应后关闭客户端
});
// 发送DNS查询请求到Google的公共DNS服务器
client.send(message, 0, message.length, 53, '8.8.8.8', (err) => {
if (err) throw err;
console.log('Message sent');
client.unref(); // 防止Node.js进程保持运行状态
});
在这段代码中,我们创建了一个 UDP 客户端来发送 DNS 查询请求,而不是一个服务器。当收到响应时,我们打印接收到的数据,并关闭客户端。此外,我们还添加了错误处理机制。
请尝试上述代码,看看是否能够解决问题。如果还是无法正常工作,请检查网络配置或防火墙设置,确保没有阻止 UDP 流量。