Apollo 10.0
自动驾驶开放平台
apollo::bridge::UDPListener< T > 模板类 参考

#include <udp_listener.h>

apollo::bridge::UDPListener< T > 的协作图:

struct  Param
 

Public 类型

typedef bool(T::* func) (int fd)
 

Public 成员函数

 UDPListener ()
 
 UDPListener (T *receiver, uint16_t port, func msg_handle)
 
 ~UDPListener ()
 
void SetMsgHandle (func msg_handle)
 
bool Initialize (T *receiver, func msg_handle, uint16_t port)
 
bool Listen ()
 

静态 Public 成员函数

static void * pthread_handle_message (void *param)
 

详细描述

template<typename T>
class apollo::bridge::UDPListener< T >

在文件 udp_listener.h36 行定义.

成员类型定义说明

◆ func

template<typename T >
typedef bool(T::* apollo::bridge::UDPListener< T >::func) (int fd)

在文件 udp_listener.h38 行定义.

构造及析构函数说明

◆ UDPListener() [1/2]

template<typename T >
apollo::bridge::UDPListener< T >::UDPListener ( )
inline

在文件 udp_listener.h39 行定义.

39{}

◆ UDPListener() [2/2]

template<typename T >
apollo::bridge::UDPListener< T >::UDPListener ( T *  receiver,
uint16_t  port,
func  msg_handle 
)
inline

在文件 udp_listener.h40 行定义.

40 {
41 receiver_ = receiver;
42 listened_port_ = port;
43 msg_handle_ = msg_handle;
44 }

◆ ~UDPListener()

template<typename T >
apollo::bridge::UDPListener< T >::~UDPListener ( )
inline

在文件 udp_listener.h45 行定义.

45 {
46 if (listener_sock_ != -1) {
47 close(listener_sock_);
48 }
49 }

成员函数说明

◆ Initialize()

template<typename T >
bool apollo::bridge::UDPListener< T >::Initialize ( T *  receiver,
func  msg_handle,
uint16_t  port 
)

在文件 udp_listener.h76 行定义.

76 {
77 msg_handle_ = msg_handle;
78 if (!msg_handle_) {
79 return false;
80 }
81
82 receiver_ = receiver;
83 if (!receiver_) {
84 return false;
85 }
86 listened_port_ = port;
87 struct rlimit rt;
88 rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
89 if (setrlimit(RLIMIT_NOFILE, &rt) == -1) {
90 return false;
91 }
92
93 listener_sock_ = socket(AF_INET, SOCK_DGRAM, 0);
94 if (listener_sock_ == -1) {
95 return false;
96 }
97 int opt = SO_REUSEADDR;
98 setsockopt(listener_sock_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
99 setnonblocking(listener_sock_);
100
101 struct sockaddr_in serv_addr;
102 serv_addr.sin_family = PF_INET;
103 serv_addr.sin_port = htons((uint16_t)listened_port_);
104 serv_addr.sin_addr.s_addr = INADDR_ANY;
105 if (bind(listener_sock_, (struct sockaddr *)&serv_addr,
106 sizeof(struct sockaddr)) == -1) {
107 close(listener_sock_);
108 return false;
109 }
110 kdpfd_ = epoll_create(MAXEPOLLSIZE);
111 struct epoll_event ev;
112 ev.events = EPOLLIN | EPOLLET;
113 ev.data.fd = listener_sock_;
114 if (epoll_ctl(kdpfd_, EPOLL_CTL_ADD, listener_sock_, &ev) < 0) {
115 close(listener_sock_);
116 return false;
117 }
118 return true;
119}
constexpr int MAXEPOLLSIZE

◆ Listen()

template<typename T >
bool apollo::bridge::UDPListener< T >::Listen ( )

在文件 udp_listener.h122 行定义.

122 {
123 int nfds = -1;
124 bool res = true;
125 struct epoll_event events[MAXEPOLLSIZE];
126 while (true) {
127 nfds = epoll_wait(kdpfd_, events, 10000, -1);
128 if (nfds == -1) {
129 res = false;
130 break;
131 }
132
133 for (int i = 0; i < nfds; ++i) {
134 if (events[i].data.fd == listener_sock_) {
135 pthread_t thread;
136 pthread_attr_t attr;
137 pthread_attr_init(&attr);
138 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
139 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
140 Param *par = new Param;
141 par->fd_ = events[i].data.fd;
142 par->listener_ = this;
143 if (pthread_create(&thread, &attr,
145 reinterpret_cast<void *>(par))) {
146 res = false;
147 return res;
148 }
149 }
150 }
151 }
152 close(listener_sock_);
153 return res;
154}
static void * pthread_handle_message(void *param)

◆ pthread_handle_message()

template<typename T >
void * apollo::bridge::UDPListener< T >::pthread_handle_message ( void *  param)
static

在文件 udp_listener.h165 行定义.

165 {
166 Param *par = static_cast<Param *>(param);
167 int fd = par->fd_;
168 UDPListener<T> *listener = par->listener_;
169 if (par) {
170 delete par;
171 }
172 par = nullptr;
173 if (!listener) {
174 pthread_exit(nullptr);
175 }
176 listener->MessageHandle(fd);
177 pthread_exit(nullptr);
178}

◆ SetMsgHandle()

template<typename T >
void apollo::bridge::UDPListener< T >::SetMsgHandle ( func  msg_handle)
inline

在文件 udp_listener.h51 行定义.

51{ msg_handle_ = msg_handle; }

该类的文档由以下文件生成: