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; }