示例#1
0
        public ServerChildJob(ServerChildJobState st)
        {
            socketID = st.socketID;
            socket = st.workerSocket;
            traceLog = st.traceLog;
            mainDb = st.mainDb;

            stateArray = new IFSMInterface[(int)State.STATE_COUNT];
            stateArray[(int)State.STATE_INIT] = new WWClientState_Init();
            stateArray[(int)State.STATE_SHUTDOWN] = new WWClientState_Shutdown();

            stateID = (int)State.STATE_INIT;
            fsm = new FSM(stateArray[stateID]);
        }
示例#2
0
            // 接続処理用コールバック
            private static void AcceptCallback(IAsyncResult ar)
            {
                AcceptWorker server = (AcceptWorker)ar.AsyncState;
                Socket listener = server.listenerSocket;
                Socket worker = null;

                if (listener == null)
                {
                    return;
                }

                try
                {
                    worker = listener.EndAccept(ar);

                    // クライアント用ソケットをリストに追加
                    int id = Interlocked.Increment(ref server.workerSocketId);
                    server.workerSocketHash.Add(id, worker);

                    // 接続処理を再開
                    server.acceptDone.Set();

                    // ログにクライアント情報を出力
                    {
                        IPEndPoint remoteEP = (IPEndPoint)worker.RemoteEndPoint;
                        server.WriteLog(TraceEventType.Information, "Connected from -- [" + remoteEP.Address + "]");
                    }

                    ServerChildJob clientJob = null;
                    {
                        ServerChildJobState state = new ServerChildJobState();
                        state.socketID = id;
                        state.workerSocket = worker;
                        state.traceLog = server.traceLog;
                        state.mainDb = server.mainDb;
                        clientJob = new ServerChildJob(state);
                    }

                    // クライアント応対処理
                    while (!clientJob.IsShutdown())
                    {
                        clientJob.Update();
                        Thread.Sleep(0);
                    }

                    // クライアント用ソケットをから削除
                    server.workerSocketHash.Remove(id);
                }
                catch (Exception e)
                {
                    server.WriteLog(TraceEventType.Error, "AcceptCallback: " + e.Message);
                }
                finally
                {
                    // 終了処理
                    if (worker != null)
                    {
                        if (worker.Connected)
                        {
                            worker.Shutdown(SocketShutdown.Both);
                        }
                        worker.Close();
                    }
                }
            }