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.
200 lines
2.5 KiB
200 lines
2.5 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Globals.c
|
|
|
|
Abstract:
|
|
|
|
This module manages client connections. A single worker thread
|
|
handles client requests serially.
|
|
|
|
Author:
|
|
|
|
Charles K. Moore (keithmo) 24-July-1994
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "rnrsvcp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
//
|
|
// Private globals.
|
|
//
|
|
|
|
SOCKET RnrpClientSocket = INVALID_SOCKET;
|
|
|
|
|
|
//
|
|
// Private prototypes.
|
|
//
|
|
|
|
VOID
|
|
RnrpHandleTransfer(
|
|
SOCKET ClientSocket
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// Public functions.
|
|
//
|
|
|
|
APIERR
|
|
RnrClientInitialize(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Performs any necessary client initialization.
|
|
|
|
Return Value:
|
|
|
|
APIERR - NO_ERROR if successful, Win32 error code if not.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Success!
|
|
//
|
|
|
|
return NO_ERROR;
|
|
|
|
} // RnrClientInitialize
|
|
|
|
|
|
VOID
|
|
RnrClientTerminate(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Performs any necessary client cleanup.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Blow off any active client.
|
|
//
|
|
|
|
if( RnrpClientSocket != INVALID_SOCKET ) {
|
|
closesocket( RnrpClientSocket );
|
|
RnrpClientSocket = INVALID_SOCKET;
|
|
}
|
|
|
|
} // RnrClientTerminate
|
|
|
|
|
|
VOID
|
|
RnrClientHandler(
|
|
SOCKET ClientSocket
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Services a connection request from a client.
|
|
|
|
Arguments:
|
|
|
|
ClientSocket - The newly accepted socket from the client.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Save the socket so the transfer may be forcibly terminated.
|
|
//
|
|
|
|
RnrpClientSocket = ClientSocket;
|
|
|
|
//
|
|
// Let RnrpHandleTransfer do the dirty work.
|
|
//
|
|
|
|
RnrpHandleTransfer( ClientSocket );
|
|
|
|
//
|
|
// Reset the global socket since the transfer is completed.
|
|
//
|
|
|
|
RnrpClientSocket = INVALID_SOCKET;
|
|
|
|
} // RnrClientHandler
|
|
|
|
|
|
|
|
//
|
|
// Private functions.
|
|
//
|
|
|
|
VOID
|
|
RnrpHandleTransfer(
|
|
SOCKET ClientSocket
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Services a transfer request for a single client.
|
|
|
|
Arguments:
|
|
|
|
ClientSocket - The socket.
|
|
|
|
--*/
|
|
|
|
{
|
|
INT result;
|
|
BYTE buffer[1024];
|
|
|
|
//
|
|
// Loop echoing data back to the client.
|
|
//
|
|
|
|
while ( TRUE ) {
|
|
result = recv( ClientSocket, buffer, sizeof(buffer), 0 );
|
|
|
|
if( result <= 0 ) {
|
|
//
|
|
// Connection terminated gracefully or receive failure.
|
|
//
|
|
|
|
break;
|
|
}
|
|
|
|
result = send( ClientSocket, buffer, result, 0 );
|
|
|
|
if( result < 0 ) {
|
|
//
|
|
// Send failure.
|
|
//
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Close the connected socket.
|
|
//
|
|
|
|
closesocket( ClientSocket );
|
|
|
|
} // RnrpHandleTransfer
|
|
|