private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { Console.WriteLine("Client connection accepted. Local Address: {0}, Remote Address: {1}", acceptEventArgs.AcceptSocket.LocalEndPoint, acceptEventArgs.AcceptSocket.RemoteEndPoint); AsyncSocketUserToken userToken = AsyncSocketUserTokenPool.Pop(); AsyncSocketUserTokenList.Add(userToken); userToken.ConnectSocket = acceptEventArgs.AcceptSocket; userToken.ConnectDateTime = DateTime.Now; try { bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); if (!willRaiseEvent) { lock (userToken) { ProcessReceive(userToken.ReceiveEventArgs); } } } catch (Exception E) { Console.WriteLine("Accept client {0} error, message: {1}", userToken.ConnectSocket, E.Message); Console.WriteLine(E.StackTrace); } StartAccept(acceptEventArgs); }
private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { App.Logger.Info("Client connection accepted. Local Address: {0}, Remote Address: {1}", acceptEventArgs.AcceptSocket.LocalEndPoint, acceptEventArgs.AcceptSocket.RemoteEndPoint); AsyncSocketUserToken userToken = AsyncSocketUserTokenPool.Pop(); AsyncSocketUserTokenList.Add(userToken); //添加到正在连接列表 userToken.ConnectSocket = acceptEventArgs.AcceptSocket; userToken.ConnectDateTime = DateTime.Now; try { bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); //投递接收请求 if (!willRaiseEvent) { lock (userToken) { ProcessReceive(userToken.ReceiveEventArgs); } } } catch (Exception E) { App.Logger.Error("Accept client {0} error, message: {1}", userToken.ConnectSocket, E.Message); App.Logger.Error(E.StackTrace); } StartAccept(acceptEventArgs); //把当前异步事件释放,等待下次连接 }
public void CloseSocket(AsyncSocketUserToken userToken) { if (userToken.ConnectSocket == null) { return; } string socketInfo = string.Format("Local Address: {0} Remote Address: {1}", userToken.ConnectSocket.LocalEndPoint, userToken.SendEventArgs.RemoteEndPoint); App.Logger.Info("Connection disconnected. {0}", socketInfo); try { userToken.ConnectSocket.Shutdown(SocketShutdown.Both); } catch (Exception E) { App.Logger.Info("CloseSocket Disconnect {0} error, message: {1}", socketInfo, E.Message); } userToken.ConnectSocket.Close(); userToken.ConnectSocket = null; //释放引用,并清理缓存,包括释放协议对象等资源 userToken.TokenClose(); MaxNumberAccepted.Release(); AsyncSocketUserTokenPool.Push(userToken); AsyncSocketUserTokenList.Remove(userToken); }
public AsyncSocketServer(int numConnections) { m_numConnections = numConnections; m_receiveBufferSize = ProtocolConst.ReceiveBufferSize; m_asyncSocketUserTokenPool = new AsyncSocketUserTokenPool(numConnections); m_asyncSocketUserTokenList = new AsyncSocketUserTokenList(); m_maxNumberAcceptedClients = new Semaphore(numConnections, numConnections); }
public void CloseAll() { AsyncSocketUserToken[] oUserTokens = null; AsyncSocketUserTokenList.CopyList(ref oUserTokens); for (int i = 0; i < oUserTokens.Length; i++) { AsyncSocketUserToken oUserToken = oUserTokens[i]; CloseSocket(oUserToken); } }
public SocketClient() : base(1) { UserToken = AsyncSocketUserTokenPool.Pop(); AsyncSocketUserTokenList.Add(UserToken); }