I’m writing a mod for a game(minecraft), for a friend. to do the specified function of the mod I need to make sure a server is reachable within a certain time, I used InetAddress to do this but every time I use the command I get this error
2012-12-02 18:45:53 [INFO] [STDERR] java.net.UnknownHostException: addr is of illegal length
2012-12-02 18:45:53 [INFO] [STDERR] at java.net.InetAddress.getByAddress(Unknown Source)
2012-12-02 18:45:53 [INFO] [STDERR] at java.net.InetAddress.getByAddress(Unknown Source)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.CommandServSwitch.processCommand(CommandServSwitch.java:40)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.CommandHandler.executeCommand(CommandHandler.java:81)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.NetServerHandler.handleSlashCommand(NetServerHandler.java:715)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.NetServerHandler.handleChat(NetServerHandler.java:681)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.Packet3Chat.processPacket(Packet3Chat.java:60)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.MemoryConnection.processReadPackets(MemoryConnection.java:79)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.NetServerHandler.networkTick(NetServerHandler.java:82)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.NetworkListenThread.networkTick(NetworkListenThread.java:55)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:111)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:696)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:592)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.IntegratedServer.tick(IntegratedServer.java:110)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:499)
2012-12-02 18:45:53 [INFO] [STDERR] at net.minecraft.src.ThreadMinecraftServer.run(ThreadMinecraftServer.java:17)
The method generating this error(and all the code you need to know):
@Override
public void processCommand(ICommandSender var1, String[] var2) {
if(var2.length < 1 || var2.length > 3) {
throw new WrongUsageException("command.switch.usage", new Object[0]);
}
else {
servport = Integer.parseInt(var2[1]);
boolean ping = false;
try {
InetAddress IP = InetAddress.getByAddress(var2[0].getBytes());
ping = IP.isReachable(400);
} catch(UnknownHostException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
The docs for getByAddress say: “Returns an InetAddress object given the raw IP address. The argument is in network byte order: the highest order byte of the address is in getAddress()[0].”
This line of code doesn’t make any sense. The string is not the raw IP address in network byte order as the function requires. Otherwise, it would be precisely four bytes long.
You need to call InetAddress.getByName to convert from a text string, like
foo.domain.comor1.2.3.4to internal binary format.