#ifndef HV_RUDP_H_ #define HV_RUDP_H_ #include "hloop.h" #if WITH_RUDP #include "rbtree.h" #include "hsocket.h" #include "hmutex.h" #if WITH_KCP #include "kcp/ikcp.h" #include "hbuf.h" #define DEFAULT_KCP_UPDATE_INTERVAL 10 // ms #define DEFAULT_KCP_READ_BUFSIZE 1400 typedef struct kcp_s { ikcpcb* ikcp; htimer_t* update_timer; hbuf_t readbuf; } kcp_t; // NOTE: kcp_create in hio_get_kcp void kcp_release(kcp_t* kcp); #endif typedef struct rudp_s { struct rb_root rb_root; hmutex_t mutex; } rudp_t; typedef struct rudp_entry_s { struct rb_node rb_node; sockaddr_u addr; // key // val hio_t* io; #if WITH_KCP kcp_t kcp; #endif } rudp_entry_t; // NOTE: rudp_entry_t alloc when rudp_get void rudp_entry_free(rudp_entry_t* entry); void rudp_init(rudp_t* rudp); void rudp_cleanup(rudp_t* rudp); bool rudp_insert(rudp_t* rudp, rudp_entry_t* entry); // NOTE: just rb_erase, not free rudp_entry_t* rudp_remove(rudp_t* rudp, struct sockaddr* addr); rudp_entry_t* rudp_search(rudp_t* rudp, struct sockaddr* addr); #define rudp_has(rudp, addr) (rudp_search(rudp, addr) != NULL) // rudp_search + malloc + rudp_insert rudp_entry_t* rudp_get(rudp_t* rudp, struct sockaddr* addr); // rudp_remove + free void rudp_del(rudp_t* rudp, struct sockaddr* addr); #endif // WITH_RUDP #endif // HV_RUDP_H_