You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
3.6 KiB
211 lines
3.6 KiB
/*++
|
|
|
|
Copyright 1996-1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sockcomm.c
|
|
|
|
Abstract:
|
|
|
|
Implements a set of common operations for socket communication
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "sockcomm.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
BOOL
|
|
InitWinsock(
|
|
VOID
|
|
)
|
|
{
|
|
ULONG nRes;
|
|
WSADATA wsaData;
|
|
WORD wVerRequested = 0x0101; // ver 1.1
|
|
|
|
//
|
|
// Init the sockets interface
|
|
//
|
|
|
|
nRes = WSAStartup(wVerRequested, &wsaData);
|
|
if (nRes)
|
|
{
|
|
SetLastError(nRes);
|
|
fprintf (stderr, "InitWinsock couldn't init winsock: %d\n", nRes);
|
|
return (FALSE);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL
|
|
TermWinsock(
|
|
VOID
|
|
)
|
|
{
|
|
if (SOCKET_ERROR == WSACleanup())
|
|
return (FALSE);
|
|
else
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL
|
|
SendMsg(
|
|
IN SOCKET s,
|
|
IN ULONG cbBuf,
|
|
IN VOID* pBuf
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Sends a message over the socket by first sending a ULONG that
|
|
represents the size of the message followed by the message itself.
|
|
|
|
Return Value:
|
|
|
|
Returns TRUE is successful; otherwise FALSE is returned.
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// send the size of the message
|
|
//
|
|
|
|
if (!SendBytes(s, sizeof(cbBuf), &cbBuf))
|
|
return (FALSE);
|
|
|
|
//
|
|
// send the body of the message
|
|
//
|
|
|
|
if (cbBuf)
|
|
{
|
|
if (!SendBytes(s, cbBuf, pBuf))
|
|
return (FALSE);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL
|
|
ReceiveMsg(
|
|
IN SOCKET s,
|
|
IN ULONG cbBuf,
|
|
IN OUT VOID* pBuf,
|
|
OUT ULONG *pcbRead
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Receives a message over the socket. The first ULONG in the message
|
|
will be the message size. The remainder of the bytes will be the
|
|
actual message.
|
|
|
|
Return Value:
|
|
|
|
Returns TRUE is successful; otherwise FALSE is returned.
|
|
|
|
--*/
|
|
{
|
|
ULONG cbRead = 0;
|
|
ULONG cbData = 0;
|
|
|
|
*pcbRead = 0;
|
|
|
|
//
|
|
// find out how much data is in the message
|
|
//
|
|
|
|
if (!ReceiveBytes(s, sizeof(cbData), &cbData, &cbRead))
|
|
return (FALSE);
|
|
|
|
if (sizeof(cbData) != cbRead)
|
|
return (FALSE);
|
|
|
|
//
|
|
// Read the full message
|
|
//
|
|
if (cbData)
|
|
{
|
|
if (!ReceiveBytes(s, cbData, pBuf, &cbRead))
|
|
return (FALSE);
|
|
|
|
if (cbRead != cbData)
|
|
return (FALSE);
|
|
|
|
*pcbRead = cbRead;
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL
|
|
SendBytes(
|
|
IN SOCKET s,
|
|
IN ULONG cbBuf,
|
|
IN VOID* pBuf
|
|
)
|
|
{
|
|
PBYTE pTemp = (BYTE*) pBuf;
|
|
ULONG cbSent = 0;
|
|
ULONG cbRemaining = cbBuf;
|
|
|
|
if (0 == cbBuf)
|
|
return (TRUE);
|
|
|
|
while (cbRemaining)
|
|
{
|
|
cbSent = send(s, pTemp, cbRemaining, 0);
|
|
if (SOCKET_ERROR == cbSent)
|
|
{
|
|
fprintf (stderr, "SendBytes send failed: %u\n", GetLastError());
|
|
return FALSE;
|
|
}
|
|
|
|
pTemp += cbSent;
|
|
cbRemaining -= cbSent;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
ReceiveBytes(
|
|
IN SOCKET s,
|
|
IN ULONG cbBuf,
|
|
IN OUT VOID* pBuf,
|
|
OUT ULONG* pcbRead
|
|
)
|
|
{
|
|
PBYTE pTemp = (BYTE*) pBuf;
|
|
ULONG cbRead = 0;
|
|
ULONG cbRemaining = cbBuf;
|
|
|
|
while (cbRemaining)
|
|
{
|
|
cbRead = recv(s, pTemp, cbRemaining, 0);
|
|
if (0 == cbRead)
|
|
break;
|
|
|
|
if (SOCKET_ERROR == cbRead)
|
|
{
|
|
fprintf (stderr, "ReceiveBytes recv failed: %u\n", GetLastError());
|
|
return FALSE;
|
|
}
|
|
|
|
cbRemaining -= cbRead;
|
|
pTemp += cbRead;
|
|
}
|
|
|
|
*pcbRead = cbBuf - cbRemaining;
|
|
|
|
return TRUE;
|
|
}
|
|
|