void do_parsepacket(void) { for (int i = 0; i < fd_max; i++) { if (!session[i]) continue; if (!session[i]->connected && static_cast<time_t>(TimeT::now()) - static_cast<time_t>(session[i]->created) > CONNECT_TIMEOUT) { PRINTF("Session #%d timed out\n", i); session[i]->eof = 1; } if (!session[i]->rdata_size && !session[i]->eof) continue; if (session[i]->func_parse) { session[i]->func_parse(i); /// some func_parse may call delete_session if (!session[i]) continue; } /// Reclaim buffer space for what was read RFIFOFLUSH(i); } }
int chlogif_parse(int fd) { struct char_session_data* sd = NULL; // only process data from the login-server if( fd != login_fd ) { ShowDebug("parse_fromlogin: Disconnecting invalid session #%d (is not the login-server)\n", fd); do_close(fd); return 0; } if( session[fd]->flag.eof ) { do_close(fd); login_fd = -1; chlogif_on_disconnect(); return 0; } else if ( session[fd]->flag.ping ) {/* we've reached stall time */ if( DIFF_TICK(last_tick, session[fd]->rdata_tick) > (stall_time * 2) ) {/* we can't wait any longer */ set_eof(fd); return 0; } else if( session[fd]->flag.ping != 2 ) { /* we haven't sent ping out yet */ WFIFOHEAD(fd,2);// sends a ping packet to login server (will receive pong 0x2718) WFIFOW(fd,0) = 0x2719; WFIFOSET(fd,2); session[fd]->flag.ping = 2; } } sd = (struct char_session_data*)session[fd]->session_data; while(RFIFOREST(fd) >= 2) { // -1: Login server is not connected // 0: Avoid processing followup packets (prev was probably incomplete) packet // 1: Continue parsing int next = 1; uint16 command = RFIFOW(fd,0); switch( command ) { case 0x2711: next = chlogif_parse_ackconnect(fd,sd); break; case 0x2713: next = chlogif_parse_ackaccreq(fd, sd); break; case 0x2717: next = chlogif_parse_reqaccdata(fd, sd); break; case 0x2718: next = chlogif_parse_keepalive(fd, sd); break; case 0x2721: next = chlogif_parse_AccInfoAck(fd); break; case 0x2723: next = chlogif_parse_ackchangesex(fd, sd); break; case 0x2726: next = chlogif_parse_ack_global_accreg(fd, sd); break; case 0x2731: next = chlogif_parse_accbannotification(fd, sd); break; case 0x2734: next = chlogif_parse_askkick(fd,sd); break; case 0x2735: next = chlogif_parse_updip(fd,sd); break; case 0x2743: next = chlogif_parse_vipack(fd); break; default: ShowError("Unknown packet 0x%04x received from login-server, disconnecting.\n", command); set_eof(fd); return 0; } if (next == 0) return 0; //do not parse next data } RFIFOFLUSH(fd); return 0; }
void tcp_connection::handle_read(const boost::system::error_code &error, size_t bytes_transferred) { if (!socket_.is_open() && !flags.eof) { set_eof(); } if (flags.eof) return; if (error) { set_eof(); do_close(); } else if (bytes_transferred == 0) { set_eof(); do_close(); } else { rdata_size += bytes_transferred; if (parse_) parse_((pointer)this->shared_from_this()); RFIFOFLUSH(this); start_read(); } }
int chlogif_parse(int fd) { struct char_session_data* sd = NULL; // only process data from the login-server if( fd != login_fd ) { ShowDebug("parse_fromlogin: Disconnecting invalid session #%d (is not the login-server)\n", fd); do_close(fd); return 0; } if( session[fd]->flag.eof ) { do_close(fd); login_fd = -1; chlogif_on_disconnect(); return 0; } else if ( session[fd]->flag.ping ) {/* we've reached stall time */ if( DIFF_TICK(last_tick, session[fd]->rdata_tick) > (stall_time * 2) ) {/* we can't wait any longer */ set_eof(fd); return 0; } else if( session[fd]->flag.ping != 2 ) { /* we haven't sent ping out yet */ WFIFOHEAD(fd,2);// sends a ping packet to login server (will receive pong 0x2718) WFIFOW(fd,0) = 0x2719; WFIFOSET(fd,2); session[fd]->flag.ping = 2; } } sd = (struct char_session_data*)session[fd]->session_data; while(RFIFOREST(fd) >= 2) { int next=1; uint16 command = RFIFOW(fd,0); switch( command ) { case 0x2741: next = chlogif_parse_BankingAck(fd); break; case 0x2743: next = chlogif_parse_vipack(fd); break; // acknowledgement of connect-to-loginserver request case 0x2711: next = chlogif_parse_ackconnect(fd,sd); break; // acknowledgement of account authentication request case 0x2713: next = chlogif_parse_ackaccreq(fd, sd); break; // account data case 0x2717: next = chlogif_parse_reqaccdata(fd, sd); break; // login-server alive packet case 0x2718: next = chlogif_parse_keepalive(fd, sd); break; // changesex reply case 0x2723: next = chlogif_parse_ackchangesex(fd, sd); break; // reply to an account_reg2 registry request case 0x2729: next = chlogif_parse_ackacc2req(fd, sd); break; // State change of account/ban notification (from login-server) case 0x2731: next = chlogif_parse_accbannotification(fd, sd); break; // Login server request to kick a character out. [Skotlex] case 0x2734: next = chlogif_parse_askkick(fd,sd); break; // ip address update signal from login server case 0x2735: next = chlogif_parse_updip(fd,sd); break; // @accinfo result case 0x2721: next = chlogif_parse_AccInfoAck(fd); break; default: ShowError("Unknown packet 0x%04x received from login-server, disconnecting.\n", command); set_eof(fd); return 0; } if(next==0) return 0; //do not parse next data } RFIFOFLUSH(fd); return 0; }