streamss Posted January 3, 2010 Posted January 3, 2010 this as a temporary solution for L2j-Killer fix this, [c]DS Index: java/com/l2jserver/gameserver/GameServer.java =================================================================== --- java/com/l2jserver/gameserver/GameServer.java (revision 3728) +++ java/com/l2jserver/gameserver/GameServer.java (working copy) @@ -437,7 +437,7 @@ sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT; final L2GamePacketHandler gph = new L2GamePacketHandler(); - _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null); + _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph); InetAddress bindAddress = null; if (!Config.GAMESERVER_HOSTNAME.equals("*")) Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java =================================================================== --- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java (revision 3728) +++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java (working copy) @@ -14,11 +14,15 @@ */ package com.l2jserver.gameserver.network; +import java.net.InetAddress; import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.HashMap; import java.util.concurrent.RejectedExecutionException; import java.util.logging.Logger; +import org.mmocore.network.IAcceptFilter; import org.mmocore.network.IClientFactory; import org.mmocore.network.IMMOExecutor; import org.mmocore.network.IPacketHandler; @@ -29,6 +33,8 @@ import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.network.L2GameClient.GameClientState; import com.l2jserver.gameserver.network.clientpackets.*; +import com.l2jserver.loginserver.SelectorHelper; +import com.l2jserver.loginserver.SelectorHelper.Flood; import com.l2jserver.util.Util; /** @@ -40,9 +46,10 @@ * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states. * @author KenM */ -public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient> +public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter { private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName()); + private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>(); // implementation public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client) @@ -1130,4 +1137,52 @@ } } } + + @Override + public boolean accept(SocketChannel sc) + { + InetAddress addr = sc.socket().getInetAddress(); + int h = SelectorHelper.hash(addr.getAddress()); + + long current = System.currentTimeMillis(); + Flood f; + synchronized (_ipFloodMap) + { + f = _ipFloodMap.get(h); + } + if (f != null) + { + if (f.trys == -1) + { + f.lastAccess = current; + return false; + } + + if (f.lastAccess + 1000 > current) + { + f.lastAccess = current; + + if (f.trys >= 3) + { + f.trys = -1; + return false; + } + + f.trys++; + } + else + { + f.lastAccess = current; + } + } + else + { + synchronized (_ipFloodMap) + { + _ipFloodMap.put(h, new Flood()); + } + } + + return true; + } } Index: java/com/l2jserver/loginserver/SelectorHelper.java =================================================================== --- java/com/l2jserver/loginserver/SelectorHelper.java (revision 3728) +++ java/com/l2jserver/loginserver/SelectorHelper.java (working copy) @@ -123,18 +123,18 @@ * @param ip * @return */ - private int hash(byte[] ip) + public static int hash(byte[] ip) { return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000; } - private class Flood + public static class Flood { - long lastAccess; - int trys; + public long lastAccess; + public int trys; - Flood() + public Flood() { lastAccess = System.currentTimeMillis(); trys = 0; Quote
DāЯқŜiĐє Posted January 3, 2010 Posted January 3, 2010 Thx, good share, thx to L2jserver Spamming !!! What l2jServer??? Anyway M8 GJ but I think that its already shared or something like that.. Quote
B1ggBoss Posted January 3, 2010 Posted January 3, 2010 Spamming !!! What l2jServer??? the author of this patch is DrHouse, from the l2jserver team Quote
ExTrEmEDwarf Posted January 3, 2010 Posted January 3, 2010 whats the point c/ping timelines and post them here? Quote
DāЯқŜiĐє Posted January 3, 2010 Posted January 3, 2010 the author of this patch is DrHouse, from the l2jserver team And GoodT knew that?? OMG Credits?? Why I cant see them?? Indeed c/p is not a good thing !!! Quote
Coyote™ Posted January 3, 2010 Posted January 3, 2010 And GoodT knew that?? He has probably used it? Instead of trolling everybody, just thank the author. Anyway, I think that these shares should stay out of mxc ^^ More dead servers = less Lineage ][ Destruction. Thanks for the share tho. Quote
DāЯқŜiĐє Posted January 3, 2010 Posted January 3, 2010 My friend Coyote I thought that GoodT spammed (31 post and comment "Thx,Good share" ?) My mistake then...Of course we thank the author for that java code :P Quote
streamss Posted January 3, 2010 Author Posted January 3, 2010 patch works fine, but i added here also the removal of expired "bans", because without it, the IP could not login till gameserver restart (bad for LAN house..) Index: java/com/l2jserver/gameserver/GameServer.java =================================================================== --- java/com/l2jserver/gameserver/GameServer.java (revision 3703) +++ java/com/l2jserver/gameserver/GameServer.java (working copy) @@ -437,7 +437,7 @@ sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT; final L2GamePacketHandler gph = new L2GamePacketHandler(); - _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null); + _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph); InetAddress bindAddress = null; if (!Config.GAMESERVER_HOSTNAME.equals("*")) Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java =================================================================== --- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java (revision 3703) +++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java (working copy) @@ -14,11 +14,17 @@ */ package com.l2jserver.gameserver.network; +import java.net.InetAddress; import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map.Entry; import java.util.concurrent.RejectedExecutionException; import java.util.logging.Logger; +import org.mmocore.network.IAcceptFilter; import org.mmocore.network.IClientFactory; import org.mmocore.network.IMMOExecutor; import org.mmocore.network.IPacketHandler; @@ -29,6 +35,8 @@ import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.network.L2GameClient.GameClientState; import com.l2jserver.gameserver.network.clientpackets.*; +import com.l2jserver.loginserver.SelectorHelper; +import com.l2jserver.loginserver.SelectorHelper.Flood; import com.l2jserver.util.Util; /** @@ -40,9 +48,51 @@ * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states. * @author KenM */ -public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient> +public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter { private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName()); + private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>(); + + public L2GamePacketHandler() + { + super(); + Thread cleanUpIpFloodMap = new Thread() + { + public void run() + { + while (true) + { + long reference = System.currentTimeMillis() - (1000 * 300); + ArrayList<Integer> toRemove = new ArrayList<Integer>(); + synchronized (_ipFloodMap) + { + for (Entry<Integer, Flood> e : _ipFloodMap.entrySet()) + { + Flood f = e.getValue(); + if (f.lastAccess < reference) + toRemove.add(e.getKey()); + } + } + + synchronized (_ipFloodMap) + { + _ipFloodMap.keySet().removeAll(toRemove); + } + + try + { + Thread.sleep(5000); + } + catch (InterruptedException e) + { + + } + } + } + }; + cleanUpIpFloodMap.setDaemon(true); + cleanUpIpFloodMap.start(); + } // implementation public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client) @@ -1130,4 +1180,52 @@ } } } + + @Override + public boolean accept(SocketChannel sc) + { + InetAddress addr = sc.socket().getInetAddress(); + int h = SelectorHelper.hash(addr.getAddress()); + + long current = System.currentTimeMillis(); + Flood f; + synchronized (_ipFloodMap) + { + f = _ipFloodMap.get(h); + } + if (f != null) + { + if (f.trys == -1) + { + f.lastAccess = current; + return false; + } + + if (f.lastAccess + 1000 > current) + { + f.lastAccess = current; + + if (f.trys >= 3) + { + f.trys = -1; + return false; + } + + f.trys++; + } + else + { + f.lastAccess = current; + } + } + else + { + synchronized (_ipFloodMap) + { + _ipFloodMap.put(h, new Flood()); + } + } + + return true; + } } Index: java/com/l2jserver/loginserver/SelectorHelper.java =================================================================== --- java/com/l2jserver/loginserver/SelectorHelper.java (revision 3703) +++ java/com/l2jserver/loginserver/SelectorHelper.java (working copy) @@ -34,8 +34,7 @@ * * @author KenM */ -public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>, - IClientFactory<L2LoginClient>, IAcceptFilter +public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter { private HashMap<Integer, Flood> _ipFloodMap; private ThreadPoolExecutor _generalPacketsThreadPool; @@ -123,18 +122,17 @@ * @param ip * @return */ - private int hash(byte[] ip) + public static int hash(byte[] ip) { - return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 - & 0xFF000000; + return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000; } - private class Flood + public static class Flood { - long lastAccess; - int trys; + public long lastAccess; + public int trys; - Flood() + public Flood() { lastAccess = System.currentTimeMillis(); trys = 0; @@ -151,7 +149,7 @@ while (true) { long reference = System.currentTimeMillis() - (1000 * 300); - ArrayList<Integer> toRemove = new ArrayList<Integer>(50); + ArrayList<Integer> toRemove = new ArrayList<Integer>(); synchronized (_ipFloodMap) { for (Entry<Integer, Flood> e : _ipFloodMap.entrySet()) @@ -164,10 +162,7 @@ synchronized (_ipFloodMap) { - for (Integer i : toRemove) - { - _ipFloodMap.remove(i); - } + _ipFloodMap.keySet().removeAll(toRemove); } try [c]DrHouse and janiii Quote
Leprus Posted January 3, 2010 Posted January 3, 2010 credits goes to janiii(fix),JIV(fix 2),DrHouse(commit),me (sharing the killer,helping for tests) hf Quote
Versus Posted January 3, 2010 Posted January 3, 2010 I can't really see the commit at l2jserver timeline. I might be blind =/ Quote
Leprus Posted January 3, 2010 Posted January 3, 2010 I can't really see the commit at l2jserver timeline. I might be blind =/ you are Quote
takhs7 Posted January 3, 2010 Posted January 3, 2010 I can't really see the commit at l2jserver timeline. I might be blind =/ who said they commited it anyway? its a temp fix that drhouse posted on l2j forums.. maybe it doesnt even work (well it should since its drhouse's but nobody seems have tested it.. least nobody posted some feedback) Quote
GoodT Posted January 4, 2010 Posted January 4, 2010 I dont know, why a lot of users spam this forum, with "GoodT thx to L2JServer". Omg, its my thing and DāЯқŜiĐє you stop spam. You have 1k post? I think, how you have it. Quote
Elphiss™ Posted January 4, 2010 Posted January 4, 2010 working in l2jfree! i tested it. thx mate and thx to DrHouse. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.