Ejemplo n.º 1
0
        /*-------------------------------------------------------------------------
         * BeginAcceptのコールバック
         * ---------------------------------------------------------------------------*/
        private void accept_callback(IAsyncResult ar)
        {
            //接続要求を受け入れる
            Socket soc = null;

            try{
                lock (m_sync_socket){
                    soc = m_server.EndAccept(ar);
                }
            }catch {
                this.Close();
                return;
            }

            // tcp_client_baseの作成
            tcp_client_base client = this.CreateClient(soc);

            // 最大数を超えていないか
            if (m_client_list.Count >= m_max_client)
            {
                client.Close();
            }
            else
            {
                // コレクションに追加
                lock (m_sync_socket){
                    m_client_list.Add(client);
                }

                // イベントハンドラの追加
                client.Disconnected += new EventHandler(client_disconnected);
                client.ReceivedData += new ReceivedDataEventHandler(client_received_data);
                // イベントを発生
                OnAcceptedClient(new ServerEventArgs(client));

                // データ受信開始
                if (!client.is_closed)
                {
                    client.StartReceive();
                }
            }

            // 接続要求施行を再開する
            m_server.BeginAccept(new AsyncCallback(accept_callback), null);
        }