[ENet-discuss] Possible bug - some peers mysteriously disconnecting - help needed

Kresimir Cosic kreso at galacticmag.com
Tue Jan 8 08:43:40 PST 2008


Hi all!

First, sorry for the long post, but the issue might be complex.

I have been using ENET for my game www.galacticmag.com for 2 years. 
Since start, I had experienced some strange disconnects. Other than 
this, the game and the server are working just fine, it's a 
monolythic server and in the last year, other than disconnects, 
there are less than 2 bugs monthly, mostly minor stuff.

Now, as I said, I think I have a problem with ENET, but I realize 
that I might be wrong.

The problem is that some peers(players) get disconnected for no 
apparent reason, the enet connection just breaks down. And it 
happens only to a single user at a time, while the 50 other 
connected users remain unaffected.

I tried, in the last two years, to find a source of this problem, 
but the only thing that could cause the problem seems to be Enet.

There is always that question: Why other Enet users are not getting 
the same problem. Perhaps it's because my game requires players to 
stay connected for more than hour, so average connection length is 
about 50 minutes. If connection breaks, this is immediately noticed 
by players because they lose a game.

If the average connection length was lower, there would be lower 
percentage of broken connections and this might go unnoticed by 
other Enet users. Or perhaps I'm just wrong.

So I recently installed a packet sniffer and captured a short Enet 
communication (this log will be provided) which exhibits the problem.

I tried to analyze the log, but this is quite complex, and I 
probably wont be able to conclude anything since I don't know enet 
well enough.

So I thought maybe someone knowledgeable could help by analyzing the 
log, and perhaps fix the error in the Enet if it exists.

Well, if anyone has time and knowledge I would appreciate the 
help... but I understand it is a complex issue and that it might be 
too much time consuming.

Regards,
	Kresimir Cosic

%%%%%%%%
The log:

Enet version: 1.0

Log can be downloaded from:
http://www.galacticmag.com/external/lmorrison_disconnect.pcap

I think this is some kind of standard sniffer format, but I can view 
and analyze it quite nicely with Wireshark.

It's really short, total 207 packets, but the client is disconnected 
after first 139. Total length is 6 minutes.

Server's port is 29370, IP 208.71.174.109.

First 20 packets contain one successful Enet connection where user 
named LMORRISON creates new account.

Afterwards, there is a second connection that was broken unexpectedly.

Keepalive is implemented on application layer, the client sends the 
keepalive packet after 5 seconds of sending nothing. The keepalive 
packet consists of a single byte containing the value 5.

Server database reports last keepalive packet was received at the 
moment corresponding to approx. 175 seconds into log file.

At the start of the connection, clients sends it's login data, 
encrypted, and then communicates lobby chat data with the server. 
This lasts up to 5 seconds. The server game event log file confirms 
that afteward this, except for the keepalive packets, no other data 
was received from client.

Also, not contained in the log file (filtered it out), the client 
was clearly disconnected at timestamp 191 because at that point I 
received another connection attempt from same IP address, same 
username, but different port, meaning that user has restarted the 
client and is attempting to reconnect. An then another connection 
attempt at timestamp 285. Those were refused by server (no double 
logins policy). This also shows that it was probably not the client 
simply disconnectiong from internet.

Also, the client's diagnostics show that it is not using NAT.

%%%%%%%
Additional notes:

I actually changed Enet a bit (yes, well..) , but I had the 
disconnects before I did the change, in fact, it was attempt to fix 
this disconnects by giving clients more time before Enet decides to 
drop them, and with more aggressive packet resend strategy. The 
changes (made a year ago) are:
-Client: connection is dropped after a fixed time of 150 seconds of 
server not acknowledging a packet, and packet resend time is never 
higher than 7 seconds.
-Server: connection is dropped on application layer after 175 
seconds of no-keepalive, resend time always less than 7 seconds.
Removed Enet built-in keepalive/ping (calls to enet_peer_ping 
disabled) on both client and server.

I think that those changes are minimal and could not interfere with 
functioning of Enet.




More information about the ENet-discuss mailing list