Files
FileManager/Core/socketUtility.cpp
T
2025-12-15 00:18:06 -08:00

303 lines
7.6 KiB
C++

#include "socketUtility.h"
#include "utils.h"
bool socketUtility::createSocket(int af, int type, int protocol, uint64_t& result)
{
result = socket(af, type, protocol);
if (result < 0)
{
utils::debugPrint("Error: Create socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
uint64_t socketUtility::createSocket(sockaddr_in sockaddr_in, bool allow_reuse)
{
const uint64_t listen_socket = socket(AF_INET, SOCK_STREAM, 0);
if (listen_socket == INVALID_SOCKET)
{
utils::debugPrint("Error: Create socket failed: %i", WSAGetLastError());
return NULL;
}
int result;
unsigned long allowLocalAddressReuse = 1;
result = setsockopt((SOCKET)listen_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&allowLocalAddressReuse, sizeof(allowLocalAddressReuse));
if (result != 0)
{
utils::debugPrint("Error: Set socket option SO_REUSEADDR failed: %i", WSAGetLastError());
return NULL;
}
unsigned long nonBlocking = 1;
if (ioctlsocket((SOCKET)listen_socket, FIONBIO, &nonBlocking) == SOCKET_ERROR)
{
utils::debugPrint("Error: IO control socket non-blocking failed: %i", WSAGetLastError());
return NULL;
}
result = bind((SOCKET)listen_socket, (sockaddr*)&sockaddr_in, sizeof(sockaddr_in));
if (result == SOCKET_ERROR)
{
utils::debugPrint("Error: Socket bind failed: %i", WSAGetLastError());
return NULL;
}
result = listen((SOCKET)listen_socket, 10);
if (result == SOCKET_ERROR)
{
utils::debugPrint("Error: Socket listen failed: %i", WSAGetLastError());
return NULL;
}
return listen_socket;
}
bool socketUtility::connectSocket(uint64_t socket, sockaddr_in* socket_addr_in)
{
const int result = connect((SOCKET)socket, (sockaddr*)socket_addr_in, sizeof(SOCKADDR_IN));
if (result < 0)
{
utils::debugPrint("Error: Connect socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::connectSocket(uint64_t socket, sockaddr* socket_addr)
{
const int result = connect((SOCKET)socket, socket_addr, sizeof(sockaddr));
if (result < 0)
{
utils::debugPrint("Error: Connect socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::acceptSocket(uint64_t socket, uint64_t& result)
{
result = accept((SOCKET)socket, NULL, 0);
if (result < 0)
{
utils::debugPrint("Error: Accept socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::acceptSocket(uint64_t socket, sockaddr_in* socket_addr_in, uint64_t& result)
{
int dw = sizeof(sockaddr_in);
result = accept((SOCKET)socket, (sockaddr*)socket_addr_in, &dw);
if (result < 0)
{
utils::debugPrint("Error: Accept socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::acceptSocket(uint64_t socket, sockaddr* socket_addr, uint64_t& result)
{
int dw = sizeof(sockaddr);
result = accept((SOCKET)socket, socket_addr, &dw);
if (result < 0)
{
utils::debugPrint("Error: Accept socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::setSocketRecvSize(uint64_t socket, uint32_t &recv_size)
{
uint32_t recvBufferSize = RECV_SOCKET_BUFFER_SIZE;
int result = setsockopt((SOCKET)socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvBufferSize, sizeof(uint32_t));
if (result < 0)
{
utils::debugPrint("Error: Set socket option SO_RCVBUF failed: %i", WSAGetLastError());
}
int isize = sizeof(recvBufferSize);
result = getsockopt((SOCKET)socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvBufferSize, (int*)&isize);
if (result < 0)
{
recvBufferSize = 8192;
}
recv_size = recvBufferSize;
return true;
}
bool socketUtility::setSocketSendSize(uint64_t socket, uint32_t &send_size)
{
uint32_t sendBufferSize = SEND_SOCKET_BUFFER_SIZE;
int result = setsockopt((SOCKET)socket, SOL_SOCKET, SO_SNDBUF, (char*)&sendBufferSize, sizeof(uint32_t));
if (result < 0)
{
utils::debugPrint("Error: Set socket option SO_SNDBUF failed: %i", WSAGetLastError());
}
int isize = sizeof(sendBufferSize);
result = getsockopt((SOCKET)socket, SOL_SOCKET, SO_SNDBUF, (char*)&sendBufferSize, (int*)&isize);
if (result < 0)
{
sendBufferSize = 8192;
}
send_size = sendBufferSize;
return true;
}
bool socketUtility::getReadQueueLength(uint64_t socket, int &queue_length)
{
DWORD temp;
int result = ioctlsocket((SOCKET)socket, FIONREAD, &temp);
if (result < 0)
{
utils::debugPrint("Error: Get read queue length failed: %i", WSAGetLastError());
queue_length = 0;
return false;
}
queue_length = temp;
return true;
}
bool socketUtility::bindSocket(uint64_t socket, sockaddr_in* socket_addr_in)
{
int result = bind((SOCKET)socket, (sockaddr*)socket_addr_in, sizeof(sockaddr_in));
if (result < 0)
{
utils::debugPrint("Error: Bind socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::bindSocket(uint64_t socket, sockaddr* socket_addr)
{
int result = bind((SOCKET)socket, socket_addr, sizeof(sockaddr));
if (result < 0)
{
utils::debugPrint("Error: Bind socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::listenSocket(uint64_t socket, int count)
{
int result = listen((SOCKET)socket, count);
if (result < 0)
{
utils::debugPrint("Error: Listen socket failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::closeSocket(uint64_t& socket)
{
if (!socket)
{
return true;
}
int result = closesocket((SOCKET)socket);
if (result < 0)
{
utils::debugPrint("Error: Close socket failed: %i", WSAGetLastError());
socket = 0;
return false;
}
socket = 0;
return true;
}
bool socketUtility::getSocketName(uint64_t socket, sockaddr_in* socket_addr_in)
{
int size = sizeof(sockaddr_in);
int result = getsockname((SOCKET)socket, (sockaddr*)socket_addr_in, &size);
if (result < 0)
{
utils::debugPrint("Error: Get socket name failed: %i", WSAGetLastError());
return false;
}
return true;
}
bool socketUtility::getSocketName(uint64_t socket, sockaddr* socket_addr)
{
int size = sizeof(sockaddr);
const int result = getsockname((SOCKET)socket, socket_addr, &size);
if (result < 0)
{
utils::debugPrint("Error: Get socket name failed: %i", WSAGetLastError());
return false;
}
return true;
}
int socketUtility::getAvailableDataSize(const uint64_t socket)
{
unsigned long available_data = 0;
ioctlsocket((SOCKET)socket, FIONREAD, &available_data);
return (int)available_data;
}
int socketUtility::receiveSocketData(const uint64_t socket, char* buffer, const int size)
{
const int bytes_received = recv((SOCKET)socket, buffer, size, 0);
if (bytes_received == SOCKET_ERROR)
{
utils::debugPrint("Error: Socket receive failed: %i\n", WSAGetLastError());
}
return bytes_received;
}
int socketUtility::sendSocketData(const uint64_t socket, const char* buffer, const int size)
{
const int bytes_sent = send((SOCKET)socket, buffer, size, 0);
if (bytes_sent == SOCKET_ERROR)
{
utils::debugPrint("Error: Socket send failed: %i\n", WSAGetLastError());
}
return bytes_sent;
}
int socketUtility::getReadStatus(const uint64_t socket)
{
static const timeval instantSpeedPlease = { 0,0 };
fd_set a = { 1, {(SOCKET)socket} };
int result = select(0, &a, 0, 0, &instantSpeedPlease);
if (result == SOCKET_ERROR)
{
result = WSAGetLastError();
}
if (result != 0 && result != 1)
{
utils::debugPrint("Error: getReadStatus failed: %i\n", result);
return SOCKET_ERROR;
}
return result;
}
int socketUtility::endBrokerSocket(uint64_t socket)
{
int result = shutdown((SOCKET)socket, SD_BOTH);
if (result != 0)
{
utils::debugPrint("Error: Socket shutdown failed: %i", WSAGetLastError());
}
result = closesocket((SOCKET)socket);
if (result != 0)
{
utils::debugPrint("Error: Close socket failed: %i", WSAGetLastError());
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}