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]); }
// 接続処理用コールバック 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(); } } }