void RUDPSocket::process_syn_ack(BinStream& strm, const Inet_Addr& remote_addr) { RUDP_INFO("recv syn ack from " << remote_addr << ", rudp id = " << rudp_id_); RUDP()->delete_peer_index(remote_rudp_id_, remote_addr_); RUDP_INFO("recv syn ack from " << remote_addr); if(state_ != RUDP_CONNECTED) { RUDP_FATAL("state != RUDP_CONNECTED"); return ; } PARSE_RUDP_MESSAGE(strm, RUDPSyn2AckPacket, ack, "parse syn_ack failed!"); //计算RTT uint64_t now_ts = CBaseTimeValue::get_time_value().msec(); uint32_t rtt = static_cast<uint32_t>(now_ts > ack.remote_ts_ ? (now_ts - ack.remote_ts_) : 5); ccc_.set_rtt(rtt); RUDP_INFO("rtt = " << rtt << ", rudp socket id = " << rudp_id_); //触发一个写事件 if(event_handler_ != NULL) event_handler_->rudp_output_event(rudp_id_); }
void RUDPSocket::process_syn2(BinStream& strm, const Inet_Addr& remote_addr) { RUDP_INFO("recv syn2 from " << remote_addr << ", rudp id = " << rudp_id_); PARSE_RUDP_MESSAGE(strm, RUDPSyn2Packet, syn2, "parse syn2 failed!"); if(state_ == RUDP_CONNECTING) { if(syn2.syn2_result_ != 0x00) //连接异常 { RUDP_INFO("syn failed! syn2.syn2_result_ = " << (uint16_t)syn2.syn2_result_); if(event_handler_ != NULL) { RUDP_INFO("state = RUDP_FIN2_STATE, rudp id = " << rudp_id_); set_state(RUDP_FIN2_STATE); event_handler_->rudp_exception_event(rudp_id_); } else { RUDP_INFO("state = RUDP_CLOSE, rudp id = " << rudp_id_); set_state(RUDP_CLOSE); } return ; } //设置接收BUFF的初始化 //ccc_.init(syn2.start_seq_ - 1); recv_buffer_.set_first_seq(syn2.start_seq_); //设置连接信息 remote_addr_ = remote_addr; remote_rudp_id_ = syn2.local_rudp_id_; //计算RTT uint64_t now_ts = CBaseTimeValue::get_time_value().msec(); uint32_t rtt = static_cast<uint32_t>(now_ts > syn2.remote_ts_ ? (now_ts - syn2.remote_ts_) : 5); recv_buffer_.set_send_last_ack_ts(now_ts); ccc_.set_rtt(rtt); RUDP_INFO("syn succ, sart seq = " << syn2.start_seq_ << ", remote_rudp_id = " << remote_rudp_id_ << ", rtt = " << rtt); RUDP_INFO("state = RUDP_CONNECTED, rudp id = " << rudp_id_); set_state(RUDP_CONNECTED); RUDP_DEBUG("send syn ack, rudp socket id = " << rudp_id_); send_syn_ack(0, syn2.local_ts_); //触发一个写事件 if(event_handler_ != NULL) event_handler_->rudp_output_event(rudp_id_); heart_ts_ = now_ts; } else if(state_ == RUDP_CONNECTED) { RUDP_DEBUG("send syn ack, rudp socket id = " << rudp_id_); send_syn_ack(0, syn2.local_ts_); } }
void RUDPSocket::process_keeplive(BinStream& strm, const Inet_Addr& remote_addr) { RUDP_INFO("keeplive from " << remote_addr << ", rudp id = " << rudp_id_); if(state_ != RUDP_CONNECTED) { return ; } keeplive_count_ = 0; PARSE_RUDP_MESSAGE(strm, RDUPKeepLive, body, "parse keeplive failed!"); send_keeplive_ack(body.timestamp_); }
void RUDPSocket::process_keeplive_ack(BinStream& strm, const Inet_Addr& remote_addr) { RUDP_INFO("keeplive ack from " << remote_addr << ", rudp id = " << rudp_id_); if(state_ != RUDP_CONNECTED) { RUDP_WARNING("state != RUDP_CONNECTED"); return ; } keeplive_count_ = 0; PARSE_RUDP_MESSAGE(strm, RDUPKeepLive, ack, "parse keeplive ack failed!"); //计算RTT uint64_t now_ts = CBaseTimeValue::get_time_value().msec(); uint32_t rtt = static_cast<uint32_t>(now_ts > ack.timestamp_ ? (now_ts - ack.timestamp_) : 5); ccc_.set_rtt(rtt); RUDP_INFO("rtt = " << rtt << ", rudp socket id = " << rudp_id_); }
void RUDPObject::process(IRUDPAdapter* adapter, BinStream& strm, const Inet_Addr& remote_addr) { uint8_t index = INVALID_ADAPTER_INDEX; if(adapter != NULL) index = adapter->get_index(); if(adapter_array_[index] == NULL) { RUDP_FATAL("adapter is not attach!!!"); return ; } PARSE_RUDP_HEAD(rudp_head, "parse rudp head failed!!"); RUDPSocket *rudp_session = get_socket(rudp_head.remote_rudp_id_); if(rudp_session != NULL) { rudp_session->process(rudp_head.msg_id_, rudp_head.check_sum_, strm, remote_addr); return ; } //处理SYN连接请求 if(rudp_head.msg_id_ == RUDP_SYN && rudp_head.remote_rudp_id_ == INVALID_RUDP_HANDLE) { PARSE_RUDP_MESSAGE(strm, RUDPSynPacket, syn, "parse syn failed!"); //在半开连接中找 rudp_session = find_by_peer_id(syn.local_rudp_id_, remote_addr); if(rudp_session == NULL) { int32_t new_rudp_id = create_socket(); if(new_rudp_id == INVALID_RUDP_HANDLE) { send_syn2(rudp_head.remote_rudp_id_, SYSTEM_SYN_ERROR, rudp_head.check_sum_, remote_addr, adapter); RUDP_INFO("send syn2 to " << remote_addr); return ; } if(this->bind(new_rudp_id, adapter->get_local_addr()) != 0) { free_sockets(new_rudp_id); send_syn2(rudp_head.remote_rudp_id_, SYSTEM_SYN_ERROR, rudp_head.check_sum_, remote_addr, adapter); RUDP_INFO("send syn2 to " << remote_addr); return ; } //建立远程SOCKET ID与本地SOCKET ID的关系,防止重复建立连接 RUDPPeerInfo info(syn.local_rudp_id_, remote_addr); peer_socket_ids_[info] = new_rudp_id; rudp_session = get_socket(new_rudp_id); rudp_session->set_check_sum(rudp_head.check_sum_); //提示上层EVENT HANDLE进行ACCEPT,可以在上层进行SOCKET属性设置 if(listener_ != NULL) listener_->rudp_accept_event(new_rudp_id); } //进行消息处理 rudp_session->process_syn(syn, remote_addr); } else { RUDP_WARNING("error msg, msg id = " << (uint16_t)rudp_head.msg_id_ << ", rudp id = " << rudp_head.remote_rudp_id_ << ", remote addr = "<< remote_addr); } }