/// <summary> /// 새로운 클라이언트가 접속 성공했을 때 호출된다. /// AcceptAsync의 콜백 메소드에서 호출되며 여러 스레드에서 동시에 호출될 수 있기때문에 공유자원에 접근할 때는 주의해야 한다. /// </summary> private void OnNewClient(Socket clientSocket, object token) { // 플에서 하나 꺼내와 사용한다. SocketAsyncEventArgs receiveArgs = _receiveEventArgsPool.Pop(); SocketAsyncEventArgs sendArgs = _sendEventArgsPool.Pop(); // UserToken은 매번 새로 생성하여 깨끗한 인스턴스로 넣어준다. UserToken userToken = new UserToken(LogicEntry); userToken.onSessionClosed += OnSessionClosed; receiveArgs.UserToken = userToken; sendArgs.UserToken = userToken; // 어째선지 여기에 두면 즉시 연결이 끊어진다... //userToken.SetSocket(clientSocket); UserManager.Add(userToken); userToken.OnConnected(); if (SessionCreatedCallback != null) { SessionCreatedCallback(userToken); } BeginReceive(clientSocket, receiveArgs, sendArgs); Packet msg = Packet.Create(UserToken.SYS_START_HEARTBEAT); byte sendInterval = 5; msg.Push(sendInterval); //userToken.Send(msg); }
public void Close() { // 중복 수행을 막는다. if (Interlocked.CompareExchange(ref isClosed, 1, 0) == 1) { return; } if (State == TokenState.Closed) { // already closed. return; } State = TokenState.Closed; if (Socket != null) { Socket.Close(); Socket = null; } SendEventArgs.UserToken = null; ReceiveEventArgs.UserToken = null; _sendingList.Clear(); _messageResolver.ClearBuffer(); if (_peer != null) { Packet msg = Packet.Create(SYS_CLOSE_ACK); if (_dispatcher == null) { OnMessage(msg); } else { _dispatcher.OnMessage(this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position)); } } }
void Send() { Packet msg = Packet.Create((short)UserToken.SYS_UPDATE_HEARTBEAT); _server.Send(msg); }
/// <summary> /// 종료코드를 전송하여 상대방이 먼저 끊도록 한다. /// </summary> private void Byebye() { Packet bye = Packet.Create(SYS_CLOSE_REQ); Send(bye); }