100 lines
2.3 KiB
C++
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;
|
|
}
|