Java 带有netty的自定义DNS服务器-对应答部分进行编码
我正在尝试使用netty编写一个小小的自定义DNS服务器。以下代码有效,但我有两个问题: 有没有比使用DefaultDnsRawRecord更好的方法来创建DNS应答部分?还有一些其他DNS记录,如DefaultDnsOptEcsRecord或DefaultDnsPtrRecord,但它们似乎用于DNS响应的其他部分 我是否应该使用netty内部方法io.netty.util.internal.SocketUtils.addressByName为固定IP地址创建InetAddress对象,而无需实际查询本例中所需的DNS?有没有一种标准的Java方法 建立管道: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对象,而无需
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();
}
}