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; } }
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; } }
/// <summary> /// 종료코드를 전송하여 상대방이 먼저 끊도록 한다. /// </summary> void byebye() { CPacket bye = CPacket.Create(SYS_CLOSE_REQ); send(bye); }
public void send(CPacket msg) { //msg.record_size(); 헤더에 사이즈 길이를 넣는 함수인데 미 사용 send(new ArraySegment <byte>(msg.Buffer, 0, msg.Position)); }
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); } } }
void send() { CPacket msg = CPacket.Create((ushort)CUserToken.SYS_UPDATE_HEARTBEAT); this.server.send(msg); }
public void copy_to(CPacket target) { target.set_protocol(this.protocol_id); target.overwrite(this.buffer, this.position); }
public static void destroy(CPacket packet) { CPacketBufferManager.push(packet); }
public void copy_to(CPacket target) { target.WriteCode(this.code); target.overwrite(this.buffer, this.position); }
public static void Destroy(CPacket _packet) { CPacketBufferManager.Push(_packet); }
public void send(CPacket msg) { msg.record_size(); send(new ArraySegment <byte>(msg.buffer, 0, msg.position)); }
public void copy_to(CPacket target) { target.set_protocol(this.MIS_CMD); target.overwrite(this.Buffer, this.Position); }
/// <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(); } } }