COMM.C

/*++ 

Copyright 1996 - 1998 Microsoft Corporation

Module Name:

comm.c

Abstract:

Implements a set of common operations for socket communication

Revision History:

--*/

#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include "comm.h"

BOOL InitWinsock ()
{
int nRes;
WSADATA wsaData;
WORD wVerRequested = 0x0101; // ver 1.1

// Init the sockets interface
nRes = WSAStartup (wVerRequested, &wsaData);
if (nRes) {
fprintf (stderr, "Couldn't init winsock: %d\n", nRes);
return(FALSE);
}

return(TRUE);
}

BOOL TermWinsock ()
{
if (SOCKET_ERROR == WSACleanup ())
return(FALSE);
else
return(TRUE);
}

BOOL SendMsg (SOCKET s, PBYTE pBuf, DWORD cbBuf)
/*++

Routine Description:

Sends a message over the socket by first sending a DWORD that
represents the size of the message followed by the message itself.

Return Value:

Returns TRUE is successful; otherwise FALSE is returned.

--*/
{
if (0 == cbBuf)
return(TRUE);

// send the size of the message
//
if (!SendBytes (s, (PBYTE)&cbBuf, sizeof (cbBuf)))
return(FALSE);

// send the body of the message
//
if (!SendBytes (s, pBuf, cbBuf))
return(FALSE);

return(TRUE);
}

BOOL ReceiveMsg (SOCKET s, PBYTE pBuf, DWORD cbBuf, DWORD *pcbRead)
/*++

Routine Description:

Receives a message over the socket. The first DWORD 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.

--*/
{
DWORD cbRead;
DWORD cbData;

// find out how much data is in the message
//
if (!ReceiveBytes (s, (PBYTE)&cbData, sizeof (cbData), &cbRead))
return(FALSE);

if (sizeof (cbData) != cbRead)
return(FALSE);

// Read the full message
//
if (!ReceiveBytes (s, pBuf, cbData, &cbRead))
return(FALSE);

if (cbRead != cbData)
return(FALSE);

*pcbRead = cbRead;

return(TRUE);
}

BOOL SendBytes (SOCKET s, PBYTE pBuf, DWORD cbBuf)
{
PBYTE pTemp = pBuf;
int cbSent, cbRemaining = cbBuf;

if (0 == cbBuf)
return(TRUE);

while (cbRemaining) {
cbSent = send (s, pTemp, cbRemaining, 0);
if (SOCKET_ERROR == cbSent) {
fprintf (stderr, "send failed: %u\n", GetLastError ());
return FALSE;
}

pTemp += cbSent;
cbRemaining -= cbSent;
}

return TRUE;
}

BOOL ReceiveBytes (SOCKET s, PBYTE pBuf, DWORD cbBuf, DWORD *pcbRead)
{
PBYTE pTemp = pBuf;
int cbRead, cbRemaining = cbBuf;

while (cbRemaining) {
cbRead = recv (s, pTemp, cbRemaining, 0);
if (0 == cbRead)
break;

if (SOCKET_ERROR == cbRead) {
fprintf (stderr, "recv failed: %u\n", GetLastError ());
return FALSE;
}

cbRemaining -= cbRead;
pTemp += cbRead;
}

*pcbRead = cbBuf - cbRemaining;

return TRUE;
}