Example #1
0
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);
    }
}
Example #2
0
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);
	}
}