gpt4 book ai didi

java - 使用 netty 自定义 DNS 服务器 - 对答案部分进行编码

转载 作者:行者123 更新时间:2023-12-02 11:47:33 35 4
gpt4 key购买 nike

我正在尝试使用 netty 编写一个小型自定义 DNS 服务器。以下代码有效,但我有两个问题:

  1. 是否有比使用 DefaultDnsRawRecord 更好的方法来创建 DNS 应答部分?还有一些其他 DNS 记录,例如 DefaultDnsOptEcsRecordDefaultDnsPtrRecord,但它们似乎用于 DNS 响应的其他部分。

  2. 我应该使用 netty 内部方法 io.netty.util.internal.SocketUtils.addressByName() 为固定 IP 地址创建 InetAdress 对象没有实际查询我的情况所需的 DNS?有标准的 Java 方法吗?

设置管道:

        bootstrap.group(group)
.channel(NioDatagramChannel.class)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel nioDatagramChannel) throws Exception {
nioDatagramChannel.pipeline().addLast(new DatagramDnsQueryDecoder());
nioDatagramChannel.pipeline().addLast(new DatagramDnsResponseEncoder());
nioDatagramChannel.pipeline().addLast(new DnsHandler());
}
})
.option(ChannelOption.SO_BROADCAST, true)
.localAddress("127.0.0.1", 40053);

DnsHandler:

public class DnsHandler extends SimpleChannelInboundHandler<DatagramDnsQuery> {

@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramDnsQuery query) throws Exception {
DatagramDnsResponse response = new DatagramDnsResponse(query.recipient(), query.sender(), query.id());

DefaultDnsQuestion dnsQuestion = query.recordAt(DnsSection.QUESTION);
response.addRecord(DnsSection.QUESTION, dnsQuestion);

byte[] address = SocketUtils.addressByName("127.0.0.1").getAddress();
DefaultDnsRawRecord queryAnswer = new DefaultDnsRawRecord(dnsQuestion.name(),
DnsRecordType.A, 3600, Unpooled.wrappedBuffer(address));
response.addRecord(DnsSection.ANSWER, queryAnswer);

ctx.writeAndFlush(response);
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
}
}

最佳答案

由于 Netty 本身并没有真正为服务器端指定任何编码器/解码器,因此 DefaultDnsRawRecord 可能是您目前最好的选择。

您不应该使用 .internal. 包中的类,因为这些类供 netty 内部使用,并且可能随时更改或删除(因为这些不被视为公共(public) api )。仅当您真正知道自己在做什么并且不关心损坏时才使用这些。

关于java - 使用 netty 自定义 DNS 服务器 - 对答案部分进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48096965/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com