Java 带有netty的自定义DNS服务器-对应答部分进行编码

Java 带有netty的自定义DNS服务器-对应答部分进行编码,java,dns,netty,Java,Dns,Netty,我正在尝试使用netty编写一个小小的自定义DNS服务器。以下代码有效,但我有两个问题: 有没有比使用DefaultDnsRawRecord更好的方法来创建DNS应答部分?还有一些其他DNS记录,如DefaultDnsOptEcsRecord或DefaultDnsPtrRecord,但它们似乎用于DNS响应的其他部分 我是否应该使用netty内部方法io.netty.util.internal.SocketUtils.addressByName为固定IP地址创建InetAddress对象,而无需

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

有没有比使用DefaultDnsRawRecord更好的方法来创建DNS应答部分?还有一些其他DNS记录,如DefaultDnsOptEcsRecord或DefaultDnsPtrRecord,但它们似乎用于DNS响应的其他部分

我是否应该使用netty内部方法io.netty.util.internal.SocketUtils.addressByName为固定IP地址创建InetAddress对象,而无需实际查询本例中所需的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);

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

您不应该使用在.internal中抵抗的类。这些软件包供netty内部使用,可能会在任何时候更改或删除,因为它们不被视为公共api。只有当你真的知道自己在做什么而不在乎破损时,才使用这些

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();
}
}