|
@ -0,0 +1,56 @@ |
|
|
|
|
|
#include "simple_udp.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
|
|
#include <netinet/in.h>
|
|
|
|
|
|
#include <sys/socket.h>
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
using namespace iflytop; |
|
|
|
|
|
using namespace core; |
|
|
|
|
|
|
|
|
|
|
|
void SimpleUDP::initialize(int port) { |
|
|
|
|
|
// 建立一个UDP的socket
|
|
|
|
|
|
m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
|
|
|
|
|
|
|
|
|
|
|
if (m_socket == -1) { |
|
|
|
|
|
logger->error("socket failed"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
// 绑定地址信息
|
|
|
|
|
|
|
|
|
|
|
|
struct sockaddr_in servaddr; |
|
|
|
|
|
memset(&servaddr, 0, sizeof(servaddr)); |
|
|
|
|
|
servaddr.sin_family = AF_INET; |
|
|
|
|
|
servaddr.sin_port = htons(port); |
|
|
|
|
|
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
|
|
|
|
|
|
|
|
|
|
|
if (bind(m_socket, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { |
|
|
|
|
|
logger->error("bind {} failed,", port); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
logger->info("bind {} success", port); |
|
|
|
|
|
|
|
|
|
|
|
m_thread.reset(new Thread("udpThread", [this]() { //
|
|
|
|
|
|
struct sockaddr_in peeraddr; |
|
|
|
|
|
socklen_t peerlen; |
|
|
|
|
|
while (true) { |
|
|
|
|
|
memset(m_rxbuf, 0, sizeof(m_rxbuf)); |
|
|
|
|
|
|
|
|
|
|
|
memset(&peeraddr, 0, sizeof(sockaddr_in)); |
|
|
|
|
|
peerlen = sizeof(sockaddr_in); |
|
|
|
|
|
|
|
|
|
|
|
int ret = recvfrom(m_socket, m_rxbuf, sizeof(m_rxbuf), 0, (struct sockaddr *)&peeraddr, &peerlen); |
|
|
|
|
|
logger->debug("Recv msg {} from IP:{} Port:{}\n", m_rxbuf, inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port)); |
|
|
|
|
|
// int wret = ::sendto(m_socket, "Hello World!", strlen("Hello World!"), 0, (sockaddr *)&peeraddr, peerlen);
|
|
|
|
|
|
// logger->debug("sendto ret:{}", wret);
|
|
|
|
|
|
// perror("sendto");
|
|
|
|
|
|
if (ret < 0) { |
|
|
|
|
|
logger->error("recvfrom failed, {}", strerror(errno)); |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (m_on_recv) { |
|
|
|
|
|
m_on_recv(&peeraddr, m_rxbuf, ret); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
})); |
|
|
|
|
|
return; |
|
|
|
|
|
}; |