/// <SUMMARY> /// Callback function: A new connection is waiting. /// </SUMMARY> private void ConnectionReady_Handler(IAsyncResult ar) { lock (_padLock) { if (_listener == null) { return; } Socket conn = _listener.EndAccept(ar); if (_connections.Count >= _maxConnections) { //Max number of connections reached. string msg = "SE001: Server busy"; conn.Send(Encoding.UTF8.GetBytes(msg), 0, msg.Length, SocketFlags.None); conn.Shutdown(SocketShutdown.Both); conn.Close(); } else { //Start servicing a new connection ChoConnectionState st = new ChoConnectionState(); st.Connection = conn; st.Server = this; st.Serializer = Serializer; st.Provider = (ChoTcpServiceProvider)_provider.Clone(); st.Buffer = new byte[4]; _connections.Add(st); //Queue the rest of the job to be executed latter ThreadPool.QueueUserWorkItem(AcceptConnection, st); } //Resume the listening callback loop _listener.BeginAccept(ConnectionReady, null); } }
private void Connect() { _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Connect(_localEP); ChoConnectionState st = _connection = new ChoConnectionState(); st.Connection = _socket; st.Client = this; st.Serializer = Serializer; st.Provider = (ChoTcpServiceProvider)_provider.Clone(); st.Buffer = new byte[1024]; if (_socket.Connected) { RaiseConnected(); _socket.BeginReceive(_connection.Buffer, 0, 0, SocketFlags.None, ReceivedDataReady, _connection); } }