windows-nt/Source/XPSP1/NT/com/rpc/perf/raw/common/dgsccomn.c
2020-09-26 16:20:57 +08:00

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);
}
/************************************************************************/