BridgeMgr& BridgeMgr::Instance()
{
static BridgeMgr instance;
return instance;
}
void BridgeMgr::StartUDPRecvThread()
{
if (m_udpRecvRunning) return;
m_udpRecvRunning = true;
m_udpRecvThread = std::thread(&BridgeMgr::UDPRecvThreadFunc, this);
}
void BridgeMgr::StopUDPRecvThread()
{
m_udpRecvRunning = false;
m_udpServer.UnInit(); // 先关闭socket,唤醒阻塞的RecvData
if (m_udpRecvThread.joinable()) m_udpRecvThread.join();
}
void BridgeMgr::UDPRecvThreadFunc()
{
WriteLogD("Enter fucnc:%s", __FUNCTION__);
char buffer[4096];
sockaddr_in fromAddr;
while (m_udpRecvRunning) {
int len = m_udpServer.RecvData(buffer, sizeof(buffer), fromAddr);
if (len > 0) {
WriteLogD("[UDPRecv] recv data len : %d", len);
HandleUDPRecvData( (unsigned char*)buffer,len, fromAddr);
} else {
WriteLogE("[UDPRecv] err: %d, err:%d", len, WSAGetLastError());
Sleep(50);
}
}
}
int BridgeMgr::InitBridge()
{
InitLog();
// 初始化UDP Server
if (!m_udpServer.Init()) {
//std::cout << "UDP Server 初始化失败!" << std::endl;
WriteLogE("UDP Server Init Err!");
}
StartBridge();
return 0;
}
void BridgeMgr::StartBridge()
{
WriteLogD("StartUDPRecvThread");
StartUDPRecvThread();
}
void BridgeMgr::UnInitBridge()
{
WriteLogD("Enter BridgeMgr UnInit!");
// 停止UDP接收线程
StopUDPRecvThread();
WriteLogD("Exit BridgeMgr UnInit!");
}#include "UDPServer.h"
#include <iostream>
#include "glog/LogPlusHelper.h"
CUDPServer::CUDPServer() : m_sock(INVALID_SOCKET) {}
CUDPServer::~CUDPServer() {
if (m_sock != INVALID_SOCKET) {
closesocket(m_sock);
m_sock = INVALID_SOCKET;
}
}
bool CUDPServer::Init() {
m_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (m_sock == INVALID_SOCKET) {
WriteLogE("Create socket err:%d", WSAGetLastError());
return false;
}
int opt = 1;
setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));
sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(UDP_LOCAL_PORT);
if (bind(m_sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
closesocket(m_sock);
m_sock = INVALID_SOCKET;
WriteLogE("UDP bind port:%d err:%d", UDP_LOCAL_PORT, WSAGetLastError());
return false;
}
return true;
}
int CUDPServer::SendData(const char* data, int len, const sockaddr_in& toAddr) {
if (INVALID_SOCKET == m_sock)
{
return -1;
}
return sendto(m_sock, data, len, 0, (const sockaddr*)&toAddr, sizeof(toAddr));
}
int CUDPServer::RecvData(char* buffer, int len, sockaddr_in& fromAddr) {
if (INVALID_SOCKET == m_sock)
{
return -1;
}
int fromLen = sizeof(fromAddr);
return recvfrom(m_sock, buffer, len, 0, (sockaddr*)&fromAddr, &fromLen);
}
void CUDPServer::UnInit()
{
if (m_sock != INVALID_SOCKET) {
closesocket(m_sock);
m_sock = INVALID_SOCKET;
}
// WSACleanup();
std::cout << "UDPServer resource release!" << std::endl;
WriteLogD("UDPServer resource release!");
} #pragma once
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define UDP_LOCAL_PORT 49176
#define UDP_REMOTE_PORT 49175
class CUDPServer
{
public:
CUDPServer();
~CUDPServer();
bool Init();
int SendData(const char* data, int len, const sockaddr_in& toAddr);
int RecvData(char* buffer, int len, sockaddr_in& fromAddr);
void UnInit();
private:
SOCKET m_sock = INVALID_SOCKET;
}; 把上面的代码使用qt写,支持跨平台
最新发布