package cn.x47.handle; import cn.x47.model.RIPEntry; import cn.x47.model.RIPPacket; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.socket.DatagramPacket; import io.netty.handler.codec.MessageToMessageEncoder; import java.net.InetSocketAddress; import java.util.List; /** * 编码器 */ public class RIPPacketEncoder extends MessageToMessageEncoder { @Override protected void encode(ChannelHandlerContext ctx, RIPPacket msg, List out) throws Exception { ByteBuf buf = ctx.alloc().buffer(); // 编码命令和版本 buf.writeByte(msg.getCommand()); buf.writeByte(msg.getVersion()); buf.writeShort(msg.getUnused()); // unused 字段 // 编码路由条目 for (RIPEntry entry : msg.getEntries()) { buf.writeShort(entry.getAddressFamily() & 0xFFFF); if (msg.getVersion() == 2) { buf.writeShort(entry.getRouteTag() & 0xFFFF); } buf.writeBytes(entry.getIpAddress().getAddress()); if (msg.getVersion() == 2) { buf.writeBytes(entry.getSubnetMask().getAddress()); buf.writeBytes(entry.getNextHop().getAddress()); } buf.writeInt((int) entry.getMetric() & 0xFFFFFFFF); } // 根据版本选择目标地址 InetSocketAddress recipient; if (msg.getVersion() == 1) { recipient = new InetSocketAddress("255.255.255.255", 520); } else { recipient = new InetSocketAddress("224.0.0.9", 520); } out.add(new DatagramPacket(buf, recipient)); } }