You've already forked FileManager
mirror of
https://github.com/Team-Resurgent/FileManager.git
synced 2026-04-30 10:38:50 -07:00
303 lines
7.6 KiB
C++
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;
|
|
} |