/// <summary> /// 接收 /// </summary> /// <param name="e"></param> void OnReceive(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { if (e.BytesTransferred > 0) { TCPSession session = (TCPSession)e.UserToken; if (session.socket.Available == 0) { byte[] data = new byte[e.BytesTransferred]; Array.Copy(e.Buffer, e.Offset, data, 0, data.Length); if (receiveMsg != null) { receiveMsg(session, data); } } if (!session.socket.ReceiveAsync(e)) { OnReceive(e); } } } else { //close CloseClientSocket(e); } }
void OnAccept(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { Socket acceptSocket = e.AcceptSocket; L.i("连接..."); if (acceptSocket.Connected) { Interlocked.Increment(ref currConnect); SocketAsyncEventArgs sae = socketPool.Pop(); ISession session = new TCPSession(this, sae, acceptSocket); if (!sessions.TryAdd(session.SessionId, session)) { L.i("add session fali: id:" + session.SessionId); } sae.UserToken = session; int bufferSize = 1024 * 4; sae.SetBuffer(new byte[bufferSize], 0, bufferSize); if (!acceptSocket.ReceiveAsync(sae)) { OnReceive(sae); } } else { //colse CloseClientSocket(e); } } }
public void Stop() { if (checkThread != null) { checkThread.Abort(); } foreach (var item in sessions) { TCPSession session = (TCPSession)item.Value; CloseClientSocket(session.args); } }
/// <summary> /// session回收 /// </summary> void CheckSessions() { while (true) { Thread.Sleep(100000); foreach (string key in sessions.Keys) { TCPSession session = (TCPSession)sessions[key]; ISession session1 = null; if (!session.socket.Connected) { sessions.Remove(key, out session1); } } } }
private void CloseClientSocket(SocketAsyncEventArgs e) { TCPSession s = e.UserToken as TCPSession; // close the socket associated with the client try { s.socket.Shutdown(SocketShutdown.Send); } // throws if client process has already closed catch (Exception) { } s.socket.Close(); e.UserToken = null; socketPool.Push(e); Interlocked.Decrement(ref currConnect); }
public void Send(ISession session, Message message) { TCPSession tCPSession = session as TCPSession; Send(tCPSession.args, message.ToByteArray()); }