UDP 通信的特点是无连接。这里只要一个处理器 UDP_Peer_Event_Handler ,用来监听是否有数据报。
图表 2 ‑ 5
- UDP_Peer_Event_Handler ,当有对方往这边发送数据时,反应器会回调该处理器的 handler_input 事件函数
图表 2 ‑ 6
代码如下:
UDP_Peer_Event_Handler.h
#ifndef UDP_Peer_Event_HandlerH
#define UDP_Peer_Event_HandlerH
#include <ace/Event_Handler.h>
#include <ace/SOCK_Dgram.h>
#include <ace/INET_Addr.h>
#include <ace/Reactor.h>
class UDP_Peer_Event_Handler:public ACE_Event_Handler
{
public:
int handle_input(ACE_HANDLE fd=ACE_INVALID_HANDLE);
ACE_HANDLE get_handle(void) const { return gram_.get_handle(); }
UDP_Peer_Event_Handler(int port);
private:
ACE_INET_Addr addr;
ACE_SOCK_Dgram gram_;
};
#endif
UDP_Peer_Event_Handler.cpp
#include <iostream>
#include "UDP_Peer_Event_Handler.h"
int UDP_Peer_Event_Handler::handle_input(ACE_HANDLE fd)
{
char buf[1024];
char addr_str[512];
ACE_INET_Addr remote_addr;
int len = gram_.recv(buf,1023,remote_addr);
buf[len] = 0;
remote_addr.addr_to_string(addr_str,sizeof addr_str);
std::cout << "recv data from " << addr_str << ":/n"
<< buf << std::endl;
return 0;
}
UDP_Peer_Event_Handler::UDP_Peer_Event_Handler(int port):addr(port),gram_(addr)
{
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
}
main.cpp
#include "UDP_Peer_Event_Handler.h"
int main(int argc, char* argv[])
{
UDP_Peer_Event_Handler udp(9999);
ACE_Reactor::instance()->run_event_loop();
return 0;
}