mirror of https://github.com/lianthony/NT4.0
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.
322 lines
8.6 KiB
322 lines
8.6 KiB
/* --------------------------------------------------------------------
|
|
|
|
File : tcptest.cxx
|
|
|
|
Title : Test program for the TCP socket transport module.
|
|
|
|
Description :
|
|
|
|
History : Inital creation, Jim Teague, Oct 4, 1990
|
|
|
|
Jim Teague 10-19-90 Working version. Changed syntax of command
|
|
to fit better with TCP.
|
|
|
|
-------------------------------------------------------------------- */
|
|
#define INCL_DOSERRORS
|
|
#define INCL_DOS
|
|
|
|
|
|
#include "rpcapi.h"
|
|
#include "util.hxx"
|
|
#include "protstck.hxx"
|
|
#include "mutex.hxx"
|
|
#include "threads.hxx"
|
|
#include "handle.hxx"
|
|
#include "hndlsvr.hxx"
|
|
#include "rpcdebug.hxx"
|
|
|
|
|
|
#include "osfpcket.hxx"
|
|
#include "osfsvr.hxx"
|
|
#include "osfclnt.hxx"
|
|
|
|
#include "tcpsvr.hxx"
|
|
#include "tcpclnt.hxx"
|
|
#define FIVE_DIGITS 5
|
|
#define TWO_BRACKETS 2
|
|
|
|
#include <string.h>
|
|
|
|
char transportinfo[MAXHOSTNAMELEN+FIVE_DIGITS+TWO_BRACKETS];
|
|
int iterations = 0;
|
|
|
|
|
|
/* --------------------------------------------------------------------
|
|
-------------------------------------------------------------------- */
|
|
|
|
void
|
|
TCPClientTestError ( // Called when an error occurs in the client.
|
|
char * Message // The message describing the error.
|
|
)
|
|
{
|
|
printf("TCPClientTest Error : %s\n",Message);
|
|
exit(3);
|
|
}
|
|
|
|
void
|
|
TCPClientTest ( // Conduct the client half of the namepipe transport
|
|
// module tests.
|
|
)
|
|
{
|
|
TCP_CCONNECTION *CConnection = new TCP_CCONNECTION;
|
|
unsigned long Count = 64;
|
|
void * SendBuffer;
|
|
void * ReceiveBuffer;
|
|
unsigned long ReceiveBufferLength;
|
|
rpcconn_common header;
|
|
unsigned long percent[10];
|
|
unsigned long interval;
|
|
int k;
|
|
|
|
//
|
|
// transportinfo is in the following form:
|
|
//
|
|
// <hostname>[<portnumber>]
|
|
//
|
|
if (iterations != 0)
|
|
Count = iterations;
|
|
|
|
interval = (unsigned long) ( (float) Count / 10.0);
|
|
for (k=0; k<10; k++)
|
|
{
|
|
percent[k] = (k) * interval;
|
|
}
|
|
k = 9;
|
|
printf("Beginning Client test...\n");
|
|
if (CConnection->TransOpenConnection(transportinfo,
|
|
strlen(transportinfo)+1))
|
|
TCPClientTestError("CConnection->TransOpenConnection()");
|
|
ReceiveBuffer = (void *) 0;
|
|
CConnection->TransGetBuffer(&ReceiveBuffer,240);
|
|
ReceiveBufferLength = 240;
|
|
while (Count--)
|
|
{
|
|
if (Count == percent[k])
|
|
{
|
|
printf("%d percent of test completed...\n",((10-k)*10));
|
|
k--;
|
|
}
|
|
if (CConnection->TransGetBuffer(&SendBuffer,256))
|
|
TCPClientTestError("CConnection->TransGetBuffer()");
|
|
// ReceiveBuffer = (void *) 0;
|
|
header.rpc_vers = 5;
|
|
header.rpc_vers_minor = 0;
|
|
header.PTYPE = 0;
|
|
header.pfc_flags = 1;
|
|
header.frag_length = 256;
|
|
memcpy ( SendBuffer, &header, sizeof(header));
|
|
|
|
if (CConnection->TransSendReceive(SendBuffer,256,&ReceiveBuffer,
|
|
&ReceiveBufferLength))
|
|
TCPClientTestError("CConnection->TransSendReceive()");
|
|
if (CConnection->TransFreeBuffer(SendBuffer))
|
|
TCPClientTestError("CConnection->TransFreeBuffer()");
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------
|
|
-------------------------------------------------------------------- */
|
|
|
|
void
|
|
TCPServerTestError ( // Called when an error occurs in the server.
|
|
char * Message // The message describing the error.
|
|
)
|
|
{
|
|
printf("TCPServerTest Error : %s\n",Message);
|
|
exit(3);
|
|
}
|
|
|
|
void
|
|
BeATestReceiveThread ( // Act like a receive thread.
|
|
TCP_ADDRESS *Address
|
|
)
|
|
{
|
|
OSF_SCONNECTION *SConnection;
|
|
void * Buffer;
|
|
unsigned long BufferLength;
|
|
int retval;
|
|
rpcconn_common header;
|
|
|
|
while (1)
|
|
{
|
|
Buffer = (void *) 0;
|
|
//printf("BeATestReceiveThread calls TCP_ADDR/TransReceive...\n");
|
|
retval = Address->TransReceive(&SConnection,&Buffer,&BufferLength);
|
|
if (retval == 1)
|
|
{
|
|
printf("Socket is Closed\n");
|
|
if (SConnection->TransCloseConnection())
|
|
TCPServerTestError("SConnection->TransCloseConnection()");
|
|
continue;
|
|
}
|
|
else if (retval)
|
|
TCPServerTestError("Address->TransReceive()");
|
|
header.frag_length = 256;
|
|
memcpy(Buffer,&header,sizeof(header));
|
|
retval = SConnection->TransSend(Buffer,BufferLength);
|
|
if (retval == -1)
|
|
{
|
|
printf("Connection Lost\n");
|
|
if (SConnection->TransCloseConnection())
|
|
TCPServerTestError("SConnection->TransCloseConnection()");
|
|
if (SConnection->TransFreeBuffer(Buffer))
|
|
TCPServerTestError("SConnection->TransFreeBuffer()");
|
|
continue;
|
|
}
|
|
// TCPServerTestError("SConnection->TransSend()");
|
|
if (SConnection->TransFreeBuffer(Buffer))
|
|
TCPServerTestError("SConnection->TransFreeBuffer()");
|
|
if (Address->TransMarkReceiveAny(SConnection))
|
|
TCPServerTestError("Address->TransMarkReceiveAny()");
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
TCPServerTest ( // Conduct the server half of the TCP socket transport
|
|
// module tests.
|
|
)
|
|
{
|
|
RPC_PROTOCOL_STACK Stack;
|
|
OSF_SCONNECTION *SConnection;
|
|
TCP_ADDRESS *Address;
|
|
THREAD *Thread;
|
|
// void * Buffer;
|
|
// unsigned long BufferLength;
|
|
// int retval;
|
|
int ErrorCode;
|
|
// rpcconn_common header;
|
|
|
|
Stack.TransportInfoLength = strlen(transportinfo);
|
|
Stack.TransportInfo = transportinfo;
|
|
Address = new TCP_ADDRESS((PROTOCOL_STACK *)&Stack,&ErrorCode,
|
|
RpcNormalResourceUsage,0);
|
|
printf(" Stack.TransportInfo = %s, Stack.TransportInfoLength = %d\n",
|
|
Stack.TransportInfo,Stack.TransportInfoLength);
|
|
if (ErrorCode)
|
|
{
|
|
TCPServerTestError("new TCP_ADDRESS");
|
|
return();
|
|
}
|
|
|
|
Thread = new THREAD(BeATestReceiveThread,(void *) Address);
|
|
delete Thread;
|
|
|
|
|
|
while (1)
|
|
{
|
|
//printf("TCPServerTest calls TransWFC...\n");
|
|
if (Address->TransWaitForConnection(&SConnection,0))
|
|
TCPServerTestError("Address->TransWaitForConnection()");
|
|
//printf ("TCPServerTest calls MarkReceiveAny...\n");
|
|
if (Address->TransMarkReceiveAny(SConnection))
|
|
TCPServerTestError("Address->TransMarkReceiveAny()");
|
|
}
|
|
|
|
/*
|
|
|
|
while (1)
|
|
{
|
|
if (Address->TransWaitForConnection(&SConnection,0))
|
|
TCPServerTestError("Address->TransWaitForConnection()");
|
|
|
|
if (Address->TransMarkReceiveAny(SConnection))
|
|
TCPServerTestError("Address->TransMarkReceiveAny()");
|
|
|
|
while (1)
|
|
{
|
|
Buffer = (void *) 0;
|
|
retval = Address->TransReceive(&SConnection,&Buffer,
|
|
&BufferLength);
|
|
if (retval == 1)
|
|
{
|
|
printf("Pipe Closed\n");
|
|
if (SConnection->TransCloseConnection())
|
|
TCPServerTestError(
|
|
"SConnection->TransCloseConnection()");
|
|
break;
|
|
}
|
|
else if (retval)
|
|
TCPServerTestError("Address->TransReceive()");
|
|
|
|
header.frag_length = 256;
|
|
memcpy(Buffer, &header, sizeof(header));
|
|
if (SConnection->TransSend(Buffer,BufferLength))
|
|
TCPServerTestError("SConnection->TransSend()");
|
|
if (SConnection->TransFreeBuffer(Buffer))
|
|
TCPServerTestError("SConnection->TransFreeBuffer()");
|
|
if (Address->TransMarkReceiveAny(SConnection))
|
|
TCPServerTestError("Address->TransMarkReceiveAny()");
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
/* --------------------------------------------------------------------
|
|
-------------------------------------------------------------------- */
|
|
|
|
int // Return (1) if the two strings match, and (0) otherwise.
|
|
StringMatch ( // Compare two strings to see if they match.
|
|
char *First,
|
|
char *Second
|
|
)
|
|
{
|
|
while (1)
|
|
{
|
|
if (*First != *Second)
|
|
return(0);
|
|
if (*First == 0)
|
|
return(1);
|
|
First++;
|
|
Second++;
|
|
}
|
|
}
|
|
|
|
int
|
|
main (
|
|
int argc,
|
|
char * argv[]
|
|
)
|
|
{
|
|
if (argc == 4)
|
|
{
|
|
iterations = atoi(argv[3]);
|
|
argc--;
|
|
}
|
|
//
|
|
// Both -client and -server options require 3 args...
|
|
//
|
|
if (argc == 3)
|
|
{
|
|
if (StringMatch(argv[1],"-client"))
|
|
{
|
|
//
|
|
// Set up transportinfo
|
|
//
|
|
(void) strcpy(transportinfo,argv[2]);
|
|
TCPClientTest();
|
|
}
|
|
|
|
//
|
|
// If 2 args, must be -server option. Server will announce
|
|
// (again, for now) its host and port when it comes up.
|
|
//
|
|
else
|
|
{
|
|
if (StringMatch(argv[1],"-server"))
|
|
{
|
|
(void) strcpy(transportinfo,argv[2]);
|
|
TCPServerTest();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("usage: tcptest {-client host[port] | -server [port]} [iterations]\n");
|
|
exit(2);
|
|
}
|
|
|
|
printf("Successful completion\n");
|
|
exit (0);
|
|
|
|
}
|