/// <summary> /// 새로운 클라이언트가 접속 성공 했을 때 호출됩니다. /// AcceptAsync의 콜백 매소드에서 호출되며 여러 스레드에서 동시에 호출될 수 있기 때문에 공유자원에 접근할 때는 주의해야 합니다. /// </summary> /// <param name="client_socket"></param> void OnNewClient(Socket client_socket, object token) { // UserToken은 매번 새로 생성하여 깨끗한 인스턴스로 넣어준다. var uniqueId = MakeSequenceIdForSession(); var user_token = new Session(true, uniqueId, PacketDispatcher, MessageResolver, ServerOpt); user_token.OnSessionClosed += OnSessionClosed; UserManager.Add(user_token); // 플에서 하나 꺼내와 사용한다. SocketAsyncEventArgs receive_args = this.ReceiveEventArgsPool.Pop(); SocketAsyncEventArgs send_args = this.SendEventArgsPool.Pop(); receive_args.UserToken = user_token; send_args.UserToken = user_token; user_token.OnConnected(); BeginReceive(client_socket, receive_args, send_args); Packet msg = Packet.Create((short)NetworkDefine.SYS_START_HEARTBEAT); var send_interval = (byte)5; msg.Push(send_interval); user_token.Send(msg); }
public void Close() { // 중복 수행을 막는다. if (Interlocked.CompareExchange(ref this.IsClosed, 1, 0) == 1) { return; } if (CurrentState == STATE_CLOSED) { // already closed. return; } CurrentState = STATE_CLOSED; ReserveClosingMillSec = 0; Sock.Close(); Sock = null; SendEventArgs.UserToken = null; ReceiveEventArgs.UserToken = null; SendingList.Clear(); RefMsgResolver.ClearBuffer(); OnSessionClosed(this); var msg = Packet.Create((short)NetworkDefine.SYS_NTF_CLOSED); Dispatcher.IncomingPacket(true, this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position)); }
public void OnConnected() { CurrentState = STATE_CONNECTED; IsClosed = 0; AutoHeartbeat = true; var msg = Packet.Create((short)NetworkDefine.SYS_NTF_CONNECTED); Dispatcher.IncomingPacket(true, this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position)); }
void Send() { var msg = Packet.Create((short)NetworkDefine.SYS_UPDATE_HEARTBEAT); Remote.Send(msg); }