2025-04-27 07:49:33 -04:00

100 lines
2.3 KiB
C++

/*
** SOCKETS.CPP
** Davidsan
**
** Winsock-related utilities
*/
#pragma warning(disable: 4237) // disable "bool" reserved
#include "wcsutil.h"
/*--------------------------------------------------------------------------+
| CSocketCollection |
+--------------------------------------------------------------------------*/
// note! this assumes that WSAStartup() has been called before ::FInit()!
// public
BOOL
CSocketCollection::FInit(int cRsrc, char *szServer, USHORT usPort)
{
if (!CResourceCollection::FInit(cRsrc))
return FALSE;
return this->FReinit(szServer, usPort);
}
// public
BOOL
CSocketCollection::FReinit(char *szServer, USHORT usPort)
{
PHOSTENT phe;
this->CleanupAll((PVOID)INVALID_SOCKET);
if (lstrlen(szServer) >= MAX_PATH)
return FALSE;
lstrcpy(m_szServer, szServer);
m_usPort = usPort;
FillMemory(&m_sin, 0, sizeof(m_sin));
m_sin.sin_family = AF_INET;
m_sin.sin_port = htons(usPort);
if (*szServer >= '0' && *szServer <= '9')
{
m_sin.sin_addr.s_addr = inet_addr(szServer);
if (m_sin.sin_addr.s_addr == INADDR_NONE)
return FALSE;
}
else
{
phe = gethostbyname(szServer);
if (!phe)
return FALSE;
CopyMemory(&m_sin.sin_addr, phe->h_addr, phe->h_length);
}
return TRUE;
}
SOCKET
CSocketCollection::ScFromHrs(HRS hrs)
{
PRS prs = (PRS) hrs;
if (!prs || !prs->fValid)
return INVALID_SOCKET;
return HANDLE_TO_SOCKET(prs->pv);
}
BOOL
CSocketCollection::FInitResource(PRS prs)
{
SOCKET sc;
if (!prs)
return FALSE;
prs->pv = (PVOID)INVALID_SOCKET;
sc = socket(PF_INET, SOCK_STREAM, 0);
if (sc < 0)
return FALSE;
if (connect(sc, (PSOCKADDR)&m_sin, sizeof(m_sin)) < 0)
return FALSE;
prs->pv = (PVOID)sc;
return TRUE;
}
void
CSocketCollection::CleanupResource(PRS prs)
{
if (!prs)
return;
if (HANDLE_TO_SOCKET(prs->pv) != INVALID_SOCKET)
closesocket(HANDLE_TO_SOCKET(prs->pv));
prs->pv = (PVOID)INVALID_SOCKET;
}