rudp.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef HV_RUDP_H_
  2. #define HV_RUDP_H_
  3. #include "hloop.h"
  4. #if WITH_RUDP
  5. #include "rbtree.h"
  6. #include "hsocket.h"
  7. #include "hmutex.h"
  8. #if WITH_KCP
  9. #include "kcp/ikcp.h"
  10. #include "hbuf.h"
  11. #define DEFAULT_KCP_UPDATE_INTERVAL 10 // ms
  12. #define DEFAULT_KCP_READ_BUFSIZE 1400
  13. typedef struct kcp_s {
  14. ikcpcb* ikcp;
  15. uint32_t conv;
  16. htimer_t* update_timer;
  17. hbuf_t readbuf;
  18. } kcp_t;
  19. // NOTE: kcp_create in hio_get_kcp
  20. void kcp_release(kcp_t* kcp);
  21. #endif
  22. typedef struct rudp_s {
  23. struct rb_root rb_root;
  24. hmutex_t mutex;
  25. } rudp_t;
  26. typedef struct rudp_entry_s {
  27. struct rb_node rb_node;
  28. sockaddr_u addr; // key
  29. // val
  30. hio_t* io;
  31. #if WITH_KCP
  32. kcp_t kcp;
  33. #endif
  34. } rudp_entry_t;
  35. // NOTE: rudp_entry_t alloc when rudp_get
  36. void rudp_entry_free(rudp_entry_t* entry);
  37. void rudp_init(rudp_t* rudp);
  38. void rudp_cleanup(rudp_t* rudp);
  39. bool rudp_insert(rudp_t* rudp, rudp_entry_t* entry);
  40. // NOTE: just rb_erase, not free
  41. rudp_entry_t* rudp_remove(rudp_t* rudp, struct sockaddr* addr);
  42. rudp_entry_t* rudp_search(rudp_t* rudp, struct sockaddr* addr);
  43. #define rudp_has(rudp, addr) (rudp_search(rudp, addr) != NULL)
  44. // rudp_search + malloc + rudp_insert
  45. rudp_entry_t* rudp_get(rudp_t* rudp, struct sockaddr* addr);
  46. // rudp_remove + free
  47. void rudp_del(rudp_t* rudp, struct sockaddr* addr);
  48. #endif // WITH_RUDP
  49. #endif // HV_RUDP_H_