void RUDPSocket::process_syn(RUDPSynPacket& syn, const Inet_Addr& remote_addr) { RUDP_INFO("recv syn from " << remote_addr << ", rudp id = " << rudp_id_); if(state_ == RUDP_IDLE && rudp_id_ != INVALID_RUDP_HANDLE) { uint64_t now_timer = CBaseTimeValue::get_time_value().msec(); //初始化接收SEQ recv_buffer_.set_first_seq(syn.start_seq_); recv_buffer_.set_send_last_ack_ts(now_timer); ccc_.init(send_buffer_.get_buffer_seq() - 1); //设置连接信息 remote_addr_ = remote_addr; remote_rudp_id_ = syn.local_rudp_id_; RUDP_INFO("sart seq = " << syn.start_seq_ << ", remote_rudp_id = " << remote_rudp_id_); RUDP_DEBUG("send syn2, rudp socket id = " << rudp_id_); send_syn2(0, syn.local_ts_); RUDP_INFO("state = RUDP_CONNECTED, rudp id = " << rudp_id_); set_state(RUDP_CONNECTED); //发送一个KEEPLIVE RUDP_DEBUG("send keeplive, rudp socket id =" << rudp_id_); send_keeplive(now_timer); } else if(state_ == RUDP_CONNECTING || state_ == RUDP_CONNECTED) { RUDP_INFO("send syn2, rudp socket id = " << rudp_id_); send_syn2(0, syn.local_ts_); } else { RUDP_DEBUG("send syn2(ERROR_SYN_STATE), rudp socket id = " << rudp_id_); send_syn2(ERROR_SYN_STATE, syn.local_ts_); RUDP_INFO("state = RUDP_CLOSE, rudp id = " << rudp_id_); set_state(RUDP_CLOSE); } }
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); } }