protected AsyncSocketSession(SessionType sessionType, IPEndPoint remoteEndPoint, bool reuseSocket) : base(sessionType, remoteEndPoint) { _socket = SocketFactory.CreateSocket(sessionType); _reuseSocket = reuseSocket; _sendSaea = SocketAsyncEventArgsPoolManager.Instance.SendSaeaPool.Take(); _receiveSaea = SocketAsyncEventArgsPoolManager.Instance.ReceiveSaeaPool.Take(); (_sendSaea.UserToken as AsyncSocketSessionToken).Session = this; (_receiveSaea.UserToken as AsyncSocketSessionToken).Session = this; }
public override void Start() { try { base.Started = true; _listenerSocket = SocketFactory.CreateSocket(base.SessionType); SetSocketOptions(); _listenerSocket.Bind(base.ListenEndPoint); _listenerSocket.Listen(base.Backlog); DoAcceptAsync(); } catch (Exception ex) { CaughtException(ex); throw new Exception("Async socket session acceptor start failed.", ex); } }
void DoAcceptAsync() { Socket acceptSocket = null; lock (_reuseSocketQueue) { if (_reuseSocketQueue.Count > 0) { acceptSocket = _reuseSocketQueue.Dequeue(); } } if (acceptSocket == null) { acceptSocket = SocketFactory.CreateSocket(base.SessionType); } SocketAsyncEventArgs args = _acceptSaea; args.AcceptSocket = acceptSocket; args.UserToken = this; bool isAsync = true; try { isAsync = _listenerSocket.AcceptAsync(args); } catch (Exception ex) { args.AcceptSocket = null; CaughtException(ex); } if (!isAsync) { ProcessAccept(args); } lock (_pendingSockets) { _pendingSockets.AddLast(acceptSocket); } }