Example #1
0
void ConnClient::on_recv_udp_snd_conv(const char* buf, ssize_t size) {
	int r = -1;
	kcpuv_conv_t conv;
	hs_snd_conv_s* hs = NULL;

	r = ikcp_get_conv(buf, (long)size, &conv);
	PROC_ERR_NOLOG(r);

	CHK_COND_NOLOG(conv == CONV_SND_CONV);
	CHK_COND_NOLOG(sizeof(hs_snd_conv_s) == size);

	hs = (hs_snd_conv_s*)buf;
	CHK_COND_NOLOG(hs->n == _req_conn.n);

	r = init_kcp(hs->new_conv);
	PROC_ERR_NOLOG(r);

	_conv = hs->new_conv;
	_key = hs->key;

	hs_ack_conv_s ack;
	ack.header.key = _key;
	r = send_kcp((const char*)&ack, sizeof(ack));
	PROC_ERR(r);

	_status = CONV_ESTABLISHED;
Exit0:
	return;
}
void connection_manager::handle_kcp_packet(size_t bytes_recvd)
{
    IUINT32 conv;
    int ret = ikcp_get_conv(udp_data_, bytes_recvd, &conv);
    if (ret == 0)
        return;

    connection::shared_ptr conn_ptr = connections_.find_by_conv(conv);
    if (!conn_ptr)
        conn_ptr = connections_.add_new_connection(shared_from_this(), conv, udp_sender_endpoint_);

    if (conn_ptr)
        conn_ptr->input(udp_data_, bytes_recvd, udp_sender_endpoint_);
    else
        std::cout << "add_new_connection failed! can not connect!" << std::endl;
}