void IUserState.on_message(FreeNet.CPacket msg)
        {
            PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();

            switch (protocol)
            {
            case PROTOCOL.ENTER_GAME_ROOM_REQ:
                Program.game_main.matching_req(this.owner);
                break;

            case PROTOCOL.ENTER_GAME_ROOM_REQ2:
                Program.game_main.matching_req2(this.owner);
                break;

            case PROTOCOL.ENTER_GAME_ROOM_REQ3:
                invite_room_start(msg);
                break;

            case PROTOCOL.INVITE_ROOM_CREATE:     //친구초대방 생성
                Program.game_main.matching_req3(this.owner);
                this.owner.battle_room.board = msg.pop_int32();
                this.owner.battle_room.invite_room_check.Add(this.owner.player);
                break;

            case PROTOCOL.ENTER_GAME_ROOM_QUIT:
                this.owner.player.removed();
                break;

            case PROTOCOL.SERVER_CONNECT:
                this.owner.enter_lobby(msg.pop_string());
                break;

            case PROTOCOL.INVITE_FRIEND_REQ:
                invite_friend(msg);
                break;

            case PROTOCOL.INVITE_FRIEND_ACK:
                invite_room();
                break;

            case PROTOCOL.DENY_FRIEND:
                deny_friend(msg);
                break;

            case PROTOCOL.ROOM_REMOVED:
                this.owner.quit_room(this.owner.player.player_index);
                break;

            case PROTOCOL.INVITE_ROOM_QUIT_REQ:
                invite_room_quit();
                break;
            }
        }
Пример #2
0
        void IUserState.on_message(FreeNet.CPacket msg)
        {
            PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();

            Console.WriteLine("protocol id " + protocol);
            switch (protocol)
            {
            case PROTOCOL.ENTER_GAME_ROOM_REQ:
                Program.game_main.matching_req(this.owner);
                break;
            }
        }
Пример #3
0
        /// <summary>
        /// 종료코드를 전송하여 상대방이 먼저 끊도록 한다.
        /// </summary>
        void byebye()
        {
            CPacket bye = CPacket.Create(SYS_CLOSE_REQ);

            send(bye);
        }
Пример #4
0
 public void send(CPacket msg)
 {
     //msg.record_size();    헤더에 사이즈 길이를 넣는 함수인데 미 사용
     send(new ArraySegment <byte>(msg.Buffer, 0, msg.Position));
 }
Пример #5
0
        public void on_message(CPacket msg)
        {
            // active close를 위한 코딩.
            // 서버에서 종료하라고 연락이 왔는지 체크한다.
            // 만약 종료신호가 맞다면 disconnect를 호출하여 받은쪽에서 먼저 종료 요청을 보낸다.
            switch (msg.MIS_CMD)
            {
            case SYS_CLOSE_REQ:
                disconnect();
                return;

                //case SYS_START_HEARTBEAT:
                //    {
                //        // 순서대로 파싱해야 하므로 프로토콜 아이디는 버린다.
                //        msg.pop_protocol_id();
                //        // 전송 인터벌.
                //        byte interval = msg.pop_byte();
                //        this.heartbeat_sender = new CHeartbeatSender(this, interval);

                //        if (this.auto_heartbeat)
                //        {
                //            start_heartbeat();
                //        }
                //    }
                //    return;

                //case SYS_UPDATE_HEARTBEAT:
                //    //Console.WriteLine("heartbeat : " + DateTime.Now);
                //    this.latest_heartbeat_time = DateTime.Now.Ticks;
                //    return;
            }


            if (this.peer != null)
            {
                try
                {
                    switch (msg.MIS_CMD)
                    {
                    case SYS_CLOSE_ACK:
                        this.peer.on_removed();
                        break;

                    default:
                        this.peer.on_message(msg);
                        break;
                    }
                }
                catch (Exception)
                {
                    close();
                }
            }

            if (msg.MIS_CMD == SYS_CLOSE_ACK)
            {
                if (this.on_session_closed != null)
                {
                    this.on_session_closed(this);
                }
            }
        }
Пример #6
0
        void send()
        {
            CPacket msg = CPacket.Create((ushort)CUserToken.SYS_UPDATE_HEARTBEAT);

            this.server.send(msg);
        }
Пример #7
0
 public void copy_to(CPacket target)
 {
     target.set_protocol(this.protocol_id);
     target.overwrite(this.buffer, this.position);
 }
Пример #8
0
 public static void destroy(CPacket packet)
 {
     CPacketBufferManager.push(packet);
 }
Пример #9
0
 public void copy_to(CPacket target)
 {
     target.WriteCode(this.code);
     target.overwrite(this.buffer, this.position);
 }
Пример #10
0
 public static void Destroy(CPacket _packet)
 {
     CPacketBufferManager.Push(_packet);
 }
Пример #11
0
 public void send(CPacket msg)
 {
     msg.record_size();
     send(new ArraySegment <byte>(msg.buffer, 0, msg.position));
 }
Пример #12
0
 public void copy_to(CPacket target)
 {
     target.set_protocol(this.MIS_CMD);
     target.overwrite(this.Buffer, this.Position);
 }
Пример #13
0
        /// <summary>
        /// 비동기 전송 완료시 호출되는 콜백 매소드.
        /// </summary>
        /// <param name="e"></param>
        public void process_send(SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred <= 0 || e.SocketError != SocketError.Success)
            {
                //Console.WriteLine(string.Format("Failed to send. error {0}, transferred {1}", e.SocketError, e.BytesTransferred));
                return;
            }

            lock (this.cs_sending_queue)
            {
                // count가 0이하일 경우는 없겠지만...
                if (this.sending_queue.Count <= 0)
                {
                    throw new Exception("Sending queue count is less than zero!");
                }

                //todo:재전송 로직 다시 검토~~ 테스트 안해봤음.
                // 패킷 하나를 다 못보낸 경우는??
                int size = this.sending_queue.Peek().position;
                if (e.BytesTransferred != size)
                {
                    string error = string.Format("Need to send more! transferred {0},  packet size {1}", e.BytesTransferred, size);
                    Console.WriteLine(error);

                    // 남은 데이터 만큼 버퍼를 재설정 해주고 다시 전송한다.
                    e.SetBuffer(e.Offset, size - e.BytesTransferred);
                    bool pending = this.socket.SendAsync(e);
                    if (!pending)
                    {
                        process_send(this.send_event_args);
                    }

                    return;
                }


                //System.Threading.Interlocked.Increment(ref sent_count);
                lock (cs_count)
                {
                    ++sent_count;
                    //if (sent_count % 20000 == 0)
                    {
                        Console.WriteLine(string.Format("process send : {0}, transferred {1}, sent count {2}",
                                                        e.SocketError, e.BytesTransferred, sent_count));
                    }
                }

                //Console.WriteLine(string.Format("process send : {0}, transferred {1}, sent count {2}",
                //	e.SocketError, e.BytesTransferred, sent_count));

                // 전송 완료된 패킷을 큐에서 제거한다.
                CPacket packet = this.sending_queue.Dequeue();
                CPacket.destroy(packet);

                // 아직 전송하지 않은 대기중인 패킷이 있다면 다시한번 전송을 요청한다.
                if (this.sending_queue.Count > 0)
                {
                    start_send();
                }
            }
        }