Example #1
0
void RUDPSocket::send_data(uint64_t ack_seq_id, uint64_t cur_seq_id, const uint8_t* data, uint16_t data_size, uint64_t now_ts)
{
    if(state_ != RUDP_CONNECTED || remote_rudp_id_ < 0 || data_size <= 0)
    {
        RUDP_WARNING("send data failed! rudp socket id = " << rudp_id_);
        return ;
    }

    RUDPHeadPacket head;
    head.msg_id_ = RUDP_DATA;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    RUDPData body;
    body.ack_seq_id_ = recv_buffer_.get_ack_id();
    body.cur_seq_id_ = cur_seq_id;
    //body.data_.assign((const char*)data, data_size); //todo:减少一次拷贝

    //设置一个最后发送ACK的时刻
    recv_buffer_.set_send_last_ack_ts(now_ts);

    strm_.rewind(true);
    strm_ << local_title_ << head << body;
    //加入数据
    strm_.push_data(data, data_size);

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #2
0
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_);
}
Example #3
0
int32_t RecvUDPHandler::close()
{
	REACTOR_INSTANCE()->delete_handler(this);
	sock_dgram_.close();

	//注销桥接口
	RUDP()->unattach(&adapter_);

	return 0;
}
Example #4
0
void RUDPSocket::process(uint8_t msg_id, uint16_t check_sum, BinStream& strm, const Inet_Addr& remote_addr)
{
    if(check_sum != check_sum_)
        return ;

    keeplive_count_ = 0;

    //地址学习
    if(remote_addr_ != remote_addr)
    {
        RUDP()->delete_peer_index(remote_rudp_id_, remote_addr_);
        remote_addr_ = remote_addr;
    }

    switch(msg_id)
    {
    case RUDP_DATA:
        process_data(strm, remote_addr);
        break;

    case RUDP_DATA_ACK:
        process_data_ack(strm, remote_addr);
        break;

    case RUDP_DATA_NACK:
        process_data_nack(strm, remote_addr);
        break;

    case RUDP_SYN2:
        process_syn2(strm, remote_addr);
        break;

    case RUDP_SYN_ACK:
        process_syn_ack(strm, remote_addr);
        break;

    case RUDP_FIN:
        process_fin(strm, remote_addr);
        break;

    case RUDP_FIN2:
        process_fin2(strm, remote_addr);
        break;

    case RUDP_KEEPALIVE:
        process_keeplive(strm, remote_addr);
        break;

    case RUDP_KEEPALIVE_ACK:
        process_keeplive_ack(strm, remote_addr);
        break;
    }

    heartbeat();
}
Example #5
0
void RUDPSocket::send_fin()
{
    RUDPHeadPacket head;
    head.msg_id_ = RUDP_FIN;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    strm_.rewind(true);
    strm_ << local_title_ << head;

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #6
0
void RUDPSocket::send_keeplive_ack(uint64_t ts)
{
    RUDPHeadPacket head;
    head.msg_id_ = RUDP_KEEPALIVE_ACK;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    RDUPKeepLive body;
    body.timestamp_ = ts;

    strm_.rewind(true);
    strm_ << local_title_ << head << body;

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
int32_t RUDPListenHandler::rudp_accept_event(int32_t rudp_id)
{
	RUDPConnection *conn = new RUDPConnection();

	RUDPStream& sock = conn->get_rudp_stream();
	sock.set_handler(rudp_id);

	int buffer_size = RUDP_SEND_BUFFER;
	sock.set_option(RUDP_SEND_BUFF_SIZE, buffer_size);
	//¹ØÁªHANDLER
	RUDP()->bind_event_handle(sock.get_handler(), conn);

	conn->set_state(RUDP_CONN_CONNECTED);
	return 0;
}
Example #8
0
void RUDPSocket::set_state(uint16_t state)
{
    if(state_ >= state)
        return ;

    state_ = state;
    send_count_ = 0;

    cancel_timer();

    //释放SOCKET对象
    if(state == RUDP_CLOSE)
    {
        RUDP()->free_sockets(rudp_id_);
    }
}
Example #9
0
void RUDPSocket::send_syn_ack(uint8_t result , uint64_t remote_ts)
{
    RUDPHeadPacket head;
    head.msg_id_ = RUDP_SYN_ACK;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    RUDPSyn2AckPacket syn_ack;
    syn_ack.result_ = result;
    syn_ack.remote_ts_ = remote_ts;

    strm_.rewind(true);
    strm_ << local_title_ << head << syn_ack;

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #10
0
int32_t RUDPConnection::send(RUDPTestPacket& packet)
{
	int32_t ret = -1;
	BinStream *bin_strm = STREAMPOOL.pop_obj();
	bin_strm->rewind(true);
	*bin_strm << packet;

	if (sbuffer_.put(*bin_strm))
	{
		RUDP()->register_event(rudp_sock_.get_handler(), MASK_WRITE);
		ret = 0;
	}

	bin_strm->rewind(true);
	STREAMPOOL.push_obj(bin_strm);

	return ret;
}
Example #11
0
void RUDPSocket::send_syn()
{
    RUDPHeadPacket head;
    head.msg_id_ = RUDP_SYN;
    head.remote_rudp_id_ = INVALID_RUDP_HANDLE;
    head.check_sum_ = check_sum_;

    RUDPSynPacket syn;
    syn.version_ = RUDP_VERSION;
    syn.local_rudp_id_ = rudp_id_;
    syn.local_ts_ = CBaseTimeValue::get_time_value().msec();
    syn.max_segment_size_ = MAX_SEGMENT_SIZE;
    syn.start_seq_ = send_buffer_.get_buffer_seq();

    strm_.rewind(true);
    strm_ << local_title_ << head << syn;

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #12
0
int32_t RUDPConnection::connect(const Inet_Addr& src_addr, const Inet_Addr& dst_addr)
{
	if(rudp_sock_.open(src_addr) != 0)
	{
		return -1;
	}

	rudp_setoption(rudp_sock_.get_handler(), RUDP_NAGLE, 1);
	if(rudp_sock_.connect(dst_addr) != 0)
	{
		this->close();
		return -1;
	}

	//绑定一个事件器
	RUDP()->bind_event_handle(rudp_sock_.get_handler(), this);

	state_ = RUDP_CONN_CONNECTING;
	set_timer(23000);

	return 0;
}
Example #13
0
void RUDPSocket::send_syn2(uint8_t result, uint64_t remote_ts)
{
    RUDPHeadPacket head;
    head.msg_id_ = RUDP_SYN2;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    RUDPSyn2Packet syn2;
    syn2.version_ = RUDP_VERSION;
    syn2.local_rudp_id_ = rudp_id_;
    syn2.local_ts_ = CBaseTimeValue::get_time_value().msec();
    syn2.remote_ts_ = remote_ts;
    syn2.syn2_result_ = result;
    syn2.max_segment_size_ = MAX_SEGMENT_SIZE;
    syn2.start_seq_ = send_buffer_.get_buffer_seq();

    strm_.rewind(true);
    strm_ << local_title_ << head << syn2;

    for(uint8_t i = 0; i < 3; ++i)
        RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #14
0
void RUDPSocket::send_nack(uint64_t base_seq_id, const LossIDArray& ids)
{
    if(state_ != RUDP_CONNECTED || remote_rudp_id_ < 0)
    {
        RUDP_WARNING("send nack failed! rudp socket id = " << rudp_id_);
        return ;
    }

    RUDPHeadPacket head;
    head.msg_id_ = RUDP_DATA_NACK;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;

    RUDPDataNack nack;
    nack.base_seq_ = base_seq_id;
    nack.loss_ids_ = ids;

    strm_.rewind(true);
    strm_ << local_title_ << head << nack;

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #15
0
void RUDPSocket::send_ack(uint64_t ack_seq_id)
{
    if(state_ != RUDP_CONNECTED || remote_rudp_id_ < 0)
    {
        RUDP_WARNING("send ack failed! rudp socket id = " << rudp_id_);
        return ;
    }

    RUDPHeadPacket head;
    head.msg_id_ = RUDP_DATA_ACK;
    head.remote_rudp_id_ = remote_rudp_id_;
    head.check_sum_ = check_sum_;
    
    RUDPDataAck ack;
    ack.ack_seq_id_ = ack_seq_id;

    strm_.rewind(true);
    strm_ << local_title_ << head << ack;

    //RUDP_DEBUG("send ack, rudp_id = " << rudp_id_ << ", seq = " << ack_seq_id);

    RUDP()->send_udp(local_index_, strm_, remote_addr_);
}
Example #16
0
int32_t RecvUDPHandler::open(const Inet_Addr& local_addr)
{
	int32_t ret = sock_dgram_.open(local_addr, true);
	if(ret == 0)
	{
		//设置缓冲区大小
		int32_t buf_size = 10 * 1024 * 1024; //10M
		sock_dgram_.set_option(SOL_SOCKET, SO_RCVBUF, (void *)&buf_size, sizeof(int32_t));
		sock_dgram_.set_option(SOL_SOCKET, SO_SNDBUF, (void *)&buf_size, sizeof(int32_t));

		//本地UDP桥接口
		adapter_.set_title(0);
		adapter_.set_local_addr(local_addr);
		RUDP()->attach(&adapter_);

		return REACTOR_INSTANCE()->register_handler(this, MASK_READ);
	}
	else
	{
		return -1;
	}

}
Example #17
0
void RUDPConnection::close()
{
	RUDP()->bind_event_handle(rudp_sock_.get_handler(), NULL);
	rudp_close_event(rudp_sock_.get_handler());
}