Files
SimpleRemoter/client/IOCPUDPClient.cpp
2025-10-19 09:04:27 +02:00

67 lines
2.0 KiB
C++

#include "IOCPUDPClient.h"
BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort)
{
if (szServerIP != NULL && uPort != 0) {
SetServerAddress(szServerIP, uPort);
}
m_sCurIP = m_Domain.SelectIP();
unsigned short port = m_nHostPort;
// 创建 UDP socket
m_sClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (m_sClientSocket == INVALID_SOCKET) {
Mprintf("Failed to create UDP socket\n");
return FALSE;
}
// 初始化服务器地址结构
memset(&m_ServerAddr, 0, sizeof(m_ServerAddr));
m_ServerAddr.sin_family = AF_INET;
m_ServerAddr.sin_port = htons(port);
#ifdef _WIN32
m_ServerAddr.sin_addr.S_un.S_addr = inet_addr(m_sCurIP.c_str());
#else
if (inet_pton(AF_INET, m_sCurIP.c_str(), &m_ServerAddr.sin_addr) <= 0) {
Mprintf("Invalid address or address not supported\n");
closesocket(m_sClientSocket);
m_sClientSocket = INVALID_SOCKET;
return FALSE;
}
#endif
// UDP不调用 connect(),也不设置 TCP keep-alive 相关选项
// 创建工作线程(如果需要)
if (m_hWorkThread == NULL) {
#ifdef _WIN32
m_hWorkThread = (HANDLE)__CreateThread(NULL, 0, WorkThreadProc, (LPVOID)this, 0, NULL);
m_bWorkThread = m_hWorkThread ? S_RUN : S_STOP;
#else
pthread_t id = 0;
m_hWorkThread = (HANDLE)pthread_create(&id, nullptr, (void* (*)(void*))IOCPClient::WorkThreadProc, this);
#endif
}
Mprintf("UDP client socket created and ready to send.\n");
m_bConnected = TRUE;
return TRUE;
}
int IOCPUDPClient::ReceiveData(char* buffer, int bufSize, int flags)
{
sockaddr_in fromAddr;
int fromLen = sizeof(fromAddr);
return recvfrom(m_sClientSocket, buffer, bufSize - 1, flags, (sockaddr*)&fromAddr, &fromLen);
}
int IOCPUDPClient::SendTo(const char* buf, int len, int flags)
{
if (len > 1200) {
Mprintf("UDP large packet may lost: %d bytes\n", len);
}
return ::sendto(m_sClientSocket, buf, len, flags, (sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr));
}