EuvUdp.hpp
1 //
2 // Created by xiong on 2020/11/7.
3 //
4 
5 #ifndef EMX_EUVUDP_HPP
6 #define EMX_EUVUDP_HPP
7 
8 #include "EuvLoop.hpp"
9 
10 namespace Emx {
16  class EuvUdp {
17  public:
25  using RecvCallback =
26  std::function<void(Emx::ErrCodeE e, const char *data, int32_t size, const struct sockaddr *addr)>;
27 
28  EuvUdp() : m_udp(nullptr) {}
29 
30  virtual ~EuvUdp() { Destroy(); }
31 
38 
40  void Destroy();
41 
47  ErrCodeE OpenExistSock(uv_os_sock_t sock);
48 
55  ErrCodeE Bind(const struct sockaddr *addr, unsigned int flags);
56 
63 
71  ErrCodeE StartRecv(char *buffer, int32_t size, RecvCallback cbRecv);
72 
76  void StopRecv() { uv_udp_recv_stop(m_udp); }
77 
86  int32_t Send(uint8_t *data, int32_t size, const struct sockaddr *addr, socklen_t addrLen) {
87  return sendto(m_udp->io_watcher.fd, data, size, 0, addr, addrLen);
88  }
89 
96  ErrCodeE GetPeerName(struct sockaddr *name, int *len);
97 
104  ErrCodeE GetSockName(struct sockaddr *name, int *len);
105 
110  size_t GetSendQueueSize() { return uv_udp_get_send_queue_size(m_udp); }
111 
116  size_t GetSendQueueCount() { return uv_udp_get_send_queue_count(m_udp); }
117 
122  uv_udp_t *GetUDP() { return m_udp; }
123 
128  int32_t GetFD() { return m_udp->io_watcher.fd; }
129 
134  bool IsReceiving() { return (m_udp->flags & 0x00001000); }
135 
136  private:
137  static void OnDestroy(uv_handle_t *handle);
138 
139  private:
140  uv_udp_t *m_udp;
141  RecvCallback m_cbRecv;
142  char *m_buffer;
143  int32_t m_size;
144  };
146 }// namespace Emx
147 #endif//EMX_EUVUDP_HPP
实现多路复用循环的主体,所有基于EuvLoop的事件都应绑定到一个EuvLoop上
Definition: EuvLoop.hpp:18
基于EuvLoop的UDP异步接收发送类
Definition: EuvUdp.hpp:16
ErrCodeE Bind(const struct sockaddr *addr, unsigned int flags)
创建一个socket并绑定到本地的地址
ErrCodeE SetBroadcast(bool ena)
使能广播
bool IsReceiving()
获取当前描述符是否监听接收
Definition: EuvUdp.hpp:134
void Destroy()
销毁UDP
int32_t Send(uint8_t *data, int32_t size, const struct sockaddr *addr, socklen_t addrLen)
以阻塞的方式发送数据
Definition: EuvUdp.hpp:86
ErrCodeE StartRecv(char *buffer, int32_t size, RecvCallback cbRecv)
开始接收数据
virtual ~EuvUdp()
Definition: EuvUdp.hpp:30
uv_udp_t * GetUDP()
获取libuv的udp句柄
Definition: EuvUdp.hpp:122
ErrCodeE Create(EuvLoop &loop)
创建UDP并绑定到loop
ErrCodeE GetSockName(struct sockaddr *name, int *len)
获取本地地址
void StopRecv()
停止接收数据
Definition: EuvUdp.hpp:76
EuvUdp()
Definition: EuvUdp.hpp:28
size_t GetSendQueueSize()
获取发送等待队列中的数据大小
Definition: EuvUdp.hpp:110
std::function< void(Emx::ErrCodeE e, const char *data, int32_t size, const struct sockaddr *addr)> RecvCallback
当接收到数据后会调用此回调函数
Definition: EuvUdp.hpp:26
int32_t GetFD()
获取文件描述符fd
Definition: EuvUdp.hpp:128
ErrCodeE GetPeerName(struct sockaddr *name, int *len)
获取对端A地址
ErrCodeE OpenExistSock(uv_os_sock_t sock)
可以使用一个已经打开的socket上
size_t GetSendQueueCount()
获取发送等待队列的个数
Definition: EuvUdp.hpp:116
ErrCodeE
错误码定义
Definition: EmxTypeDef.hpp:29
Definition: EmxGpio.hpp:10