
Originally Posted by
W00dL3cs
How are you handling client disconnect with socketasynceventargs?
I mean, how does your server understand when an user refreshes the client page?
Code:
public void CloseClientSocket(SocketAsyncEventArgs e)
{
var Token = e.UserToken as GameServerToken;
var Session = GetSession(Token.Socket);
int ID = Session.ID;
Logs.WriteLine("Free client connection [" + ID + "].");
try
{
AllSessions.Remove(Session);
IDs.Remove(ID);
Users.RemoveByConnectionID(ID);
}
catch { }
try
{
Token.Socket.Shutdown(SocketShutdown.Both);
}
catch (Exception) { }
Token.Socket.Close();
Interlocked.Decrement(ref TotalConnections);
Semaphore.Release();
ReadWritePool.Push(e);
}
private void HandleSend(SocketAsyncEventArgs e)
{
if (e.SocketError != SocketError.Success)
{
CloseClientSocket(e);
}
}
private void HandleReceive(SocketAsyncEventArgs e)
{
var Token = e.UserToken as GameServerToken;
try
{
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
var Received = new byte[e.BytesTransferred];
Array.Copy(BufferManager.Buffer, e.Offset, Received, 0, e.BytesTransferred);
string Data = System.Text.Encoding.Default.GetString(Received);
Messages.Handle(GetSession(Token.Socket), Data);
}
else
{
CloseClientSocket(e);
}
}
catch { CloseClientSocket(e); }
finally { try { Token.Socket.ReceiveAsync(e); } catch { } }
}