I had a thought after my last post. I know that, in my case at least, the server list packets are getting through fine, it's just that the Client chokes on them for whatever reason.
The EQEmu login server does have a lot of servers listed on it, so the server list is somewhat big (~6k), and gets split into several fragments (10 or so) to be sent over the wire. So I thought, why not just filter out all the non-P99 servers before letting the client see them? That way the client only has to deal with a few hundred bytes, in a single packet.
I made a tiny, localhost man-in-the-middle program between the client and the login server to do just that. It is totally working for me, server select is much much more reliable with it running. Some of the code is a bit of a mess right now (lots of last-minute debugging, couldn't test it while I was coding it at work), but you can find it here:
https://github.com/Zaela/p99-login-middlemand. Includes a makefile. You can check for yourself, but I can promise that it doesn't try to sniff passwords or anything dumb like that -- all client-to-server packets are simply forwarded and maybe tweaked slightly due to the filtering desychronizing the session somewhat.
Definitely could have some bugs, but I urge you to at least give it a quick try. If it works out well, it shouldn't be too hard to set it up as a daemon and forget about all your server select problems for good.
One thing you will need to do if you want to try it is to update your eqhost.txt to point at the middleman:
Code:
[LoginServer]
Host=localhost:5998
It's configured to forward things to the EQEmu login server by default.