200 lines
5.5 KiB
C
200 lines
5.5 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1994 - 1999
|
||
|
//
|
||
|
// File: dgsccomn.c
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Filename: dgsccomn.c
|
||
|
//
|
||
|
// Description: This file contains common routines for Datagram Socket I/O
|
||
|
// routines for use with IPC raw network performance
|
||
|
// tests.
|
||
|
// This module is written using win32 API calls.
|
||
|
//
|
||
|
// Authors: Scott Holden (Translator from NT API to win32 API)
|
||
|
// Mahesh Keni (Mahesh wrote this application using mostly
|
||
|
// NT native API calls)
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "rawcom.h"
|
||
|
#include "dgsccomn.h"
|
||
|
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_Recv(
|
||
|
IN USHORT CIndex,
|
||
|
IN OUT PVOID PReadBuf,
|
||
|
IN OUT PULONG rpdatalen)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
ULONG Buflen;
|
||
|
PCHAR Bufp;
|
||
|
|
||
|
Bufp = PReadBuf;
|
||
|
Buflen = *rpdatalen; // use this for getting request packet length
|
||
|
|
||
|
*rpdatalen = 0; // total data received
|
||
|
|
||
|
// we have make sure that the data received is same as the data
|
||
|
// requested
|
||
|
|
||
|
while (Buflen) { // till we receive all the data
|
||
|
RetCode = recv(Clients[CIndex].c_Sock.c_Sockid, Bufp, Buflen, 0);
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("Error: Receive:%ld\n",WSAGetLastError());
|
||
|
break;
|
||
|
}
|
||
|
else {
|
||
|
if (RetCode){
|
||
|
*rpdatalen += (ULONG)RetCode; // bytes received
|
||
|
Buflen -= (ULONG)RetCode; // bytes yet to receive
|
||
|
Bufp += (USHORT)RetCode; // Move the buffer pointer
|
||
|
}
|
||
|
else { break; }
|
||
|
}
|
||
|
} // check to see if it's 0
|
||
|
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_RecvFrom(
|
||
|
IN USHORT CIndex,
|
||
|
IN OUT PVOID PReadBuf,
|
||
|
IN OUT PULONG rpdatalen,
|
||
|
IN OUT PSOCKADDR pcaddr,
|
||
|
IN OUT PUSHORT pcaddrlen)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
ULONG Buflen;
|
||
|
PCHAR Bufp;
|
||
|
|
||
|
Bufp = PReadBuf;
|
||
|
Buflen = *rpdatalen; // use this for getting request packet length
|
||
|
|
||
|
*rpdatalen = 0; // total data received
|
||
|
|
||
|
// we have make sure that the data received is same as the data
|
||
|
// requested
|
||
|
|
||
|
while (Buflen) { // till we receive all the data
|
||
|
RetCode = recvfrom(
|
||
|
Clients[CIndex].c_Sock.c_Sockid,
|
||
|
Bufp,
|
||
|
Buflen,
|
||
|
0,
|
||
|
pcaddr,
|
||
|
(int *)pcaddrlen);
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("Error: Receive:%ld\n",WSAGetLastError());
|
||
|
break;
|
||
|
}
|
||
|
else {
|
||
|
if (RetCode){
|
||
|
*rpdatalen += (ULONG)RetCode; // bytes received
|
||
|
Buflen -= (ULONG)RetCode; // bytes yet to receive
|
||
|
Bufp += (USHORT)RetCode; // Move the buffer pointer
|
||
|
}
|
||
|
else { break; }
|
||
|
}
|
||
|
} // check to see if it's 0
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_Send(
|
||
|
IN USHORT CIndex,
|
||
|
IN OUT PVOID PWriteBuf,
|
||
|
IN OUT PULONG spdatalen)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
ULONG Buflen;
|
||
|
|
||
|
Buflen = *spdatalen; // total data to be sent
|
||
|
|
||
|
*spdatalen = 0;
|
||
|
|
||
|
// Could use write also
|
||
|
RetCode = send(Clients[CIndex].c_Sock.c_Sockid, PWriteBuf, Buflen, 0);
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("Error: Send:%ld\n",WSAGetLastError());
|
||
|
}
|
||
|
else {
|
||
|
*spdatalen = (ULONG) RetCode;
|
||
|
} // check to see if send length is 0
|
||
|
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_SendTo(
|
||
|
IN USHORT CIndex,
|
||
|
IN OUT PVOID PWriteBuf,
|
||
|
IN OUT PULONG spdatalen,
|
||
|
IN OUT PSOCKADDR pcaddr,
|
||
|
IN OUT PUSHORT pcaddrlen)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
ULONG Buflen;
|
||
|
|
||
|
Buflen = *spdatalen; // total data to be sent
|
||
|
|
||
|
*spdatalen = 0;
|
||
|
|
||
|
// Could use write also
|
||
|
RetCode = sendto(Clients[CIndex].c_Sock.c_Sockid, PWriteBuf, Buflen, 0,
|
||
|
pcaddr, *pcaddrlen);
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("Error: Send:%ld\n",WSAGetLastError());
|
||
|
}
|
||
|
else {
|
||
|
*spdatalen = (ULONG) RetCode;
|
||
|
} // check to see if SendTo Length is 0
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_Close(
|
||
|
IN USHORT CIndex)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
|
||
|
RetCode = closesocket(Clients[CIndex].c_Sock.c_Sockid);
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("Error: Close Socket Id %ld\n",WSAGetLastError());
|
||
|
return(RetCode);
|
||
|
}
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|
||
|
INTEGER
|
||
|
DGSocket_Connect(
|
||
|
IN USHORT CIndex,
|
||
|
IN PSOCKADDR pcsockaddr)
|
||
|
{
|
||
|
INTEGER RetCode;
|
||
|
|
||
|
RetCode = connect(Clients[CIndex].c_Sock.c_Sockid,
|
||
|
pcsockaddr,
|
||
|
sizeof(SOCKADDR));
|
||
|
|
||
|
if (RetCode == SOCKET_ERROR) {
|
||
|
//DbgPrint("DGSock: Connect %ld\n",WSAGetLastError());
|
||
|
return(RetCode);
|
||
|
}
|
||
|
return(RetCode);
|
||
|
}
|
||
|
/************************************************************************/
|