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.
178 lines
4.3 KiB
178 lines
4.3 KiB
//#--------------------------------------------------------------
|
|
//
|
|
// File: packetsender.cpp
|
|
//
|
|
// Synopsis: Implementation of CPacketSender class methods
|
|
// The Class is responsible for sending RADIUS
|
|
// packet data out to the client
|
|
//
|
|
//
|
|
// History: 9/23/97 MKarki Created
|
|
//
|
|
// Copyright (C) 1997-98 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
//----------------------------------------------------------------
|
|
#include "radcommon.h"
|
|
#include "packetsender.h"
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: CPacketSender
|
|
//
|
|
// Synopsis: This is the constructor of the CPacketSender class
|
|
//
|
|
// Arguments: NONE
|
|
//
|
|
// Returns: NONE
|
|
//
|
|
//
|
|
// History: MKarki Created 11/25/97
|
|
//
|
|
//----------------------------------------------------------------
|
|
CPacketSender::CPacketSender(
|
|
VOID
|
|
)
|
|
{
|
|
} // end of CPacketSender class constructor
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: ~CPacketSender
|
|
//
|
|
// Synopsis: This is the destructor of the CPacketSender class
|
|
//
|
|
// Arguments: NONE
|
|
//
|
|
// Returns: NONE
|
|
//
|
|
// History: MKarki Created 11/25/97
|
|
//
|
|
//----------------------------------------------------------------
|
|
CPacketSender::~CPacketSender(
|
|
VOID
|
|
)
|
|
{
|
|
} // end of CPacketSender class destructor
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: SendPacket
|
|
//
|
|
// Synopsis: This is the CPacketSender public method that sends
|
|
// packets out to the net
|
|
//
|
|
// Arguments:
|
|
// [in] CPacketRadius*
|
|
//
|
|
// Returns: BOOL - bStatus
|
|
//
|
|
//
|
|
// History: MKarki Created 11/25/97
|
|
//
|
|
// CalledBy: classes derived from CProcessor and CValidator
|
|
//
|
|
//----------------------------------------------------------------
|
|
HRESULT
|
|
CPacketSender::SendPacket (
|
|
CPacketRadius *pCPacketRadius
|
|
)
|
|
{
|
|
BOOL bStatus = FALSE;
|
|
PBYTE pOutBuffer = NULL;
|
|
DWORD dwSize = 0;
|
|
DWORD dwPeerAddress = 0;
|
|
WORD wPeerPort = 0;
|
|
SOCKET sock;
|
|
HRESULT hr = S_OK;
|
|
|
|
_ASSERT (pCPacketRadius);
|
|
|
|
__try
|
|
{
|
|
|
|
if (FALSE == IsProcessingEnabled ())
|
|
{
|
|
hr = E_FAIL;
|
|
__leave;
|
|
}
|
|
|
|
//
|
|
// get the out packet buffer from the packet object
|
|
//
|
|
pOutBuffer = pCPacketRadius->GetOutPacket ();
|
|
|
|
//
|
|
// get the data size
|
|
//
|
|
dwSize = pCPacketRadius->GetOutLength ();
|
|
|
|
//
|
|
// get the Peer address
|
|
//
|
|
dwPeerAddress = pCPacketRadius->GetOutAddress ();
|
|
|
|
//
|
|
// get the Peer port number
|
|
//
|
|
wPeerPort = pCPacketRadius->GetOutPort ();
|
|
|
|
//
|
|
// get the socket
|
|
//
|
|
sock = pCPacketRadius->GetSocket ();
|
|
|
|
|
|
//
|
|
// send the data out now
|
|
//
|
|
SOCKADDR_IN sin;
|
|
sin.sin_family = AF_INET;
|
|
sin.sin_port = htons (wPeerPort);
|
|
sin.sin_addr.s_addr = htonl (dwPeerAddress);
|
|
INT iBytesSent = ::sendto (
|
|
sock,
|
|
(PCHAR)pOutBuffer,
|
|
(INT)dwSize,
|
|
0,
|
|
(PSOCKADDR)&sin,
|
|
(INT)sizeof (SOCKADDR)
|
|
);
|
|
if ((iBytesSent > 0) && (iBytesSent < dwSize))
|
|
{
|
|
IASTracePrintf (
|
|
"Unable to send out complete Radius packet"
|
|
);
|
|
}
|
|
else if (SOCKET_ERROR == iBytesSent)
|
|
{
|
|
int data = WSAGetLastError();
|
|
|
|
IASTracePrintf (
|
|
"Unable to send Radius packet due to error:%d", data
|
|
);
|
|
|
|
IASReportEvent(
|
|
RADIUS_E_CANT_SEND_RESPONSE,
|
|
0,
|
|
sizeof(data),
|
|
NULL,
|
|
&data
|
|
);
|
|
|
|
hr = RADIUS_E_ERRORS_OCCURRED;
|
|
__leave;
|
|
}
|
|
|
|
//
|
|
// success
|
|
//
|
|
}
|
|
__finally
|
|
{
|
|
}
|
|
|
|
return (hr);
|
|
|
|
} // end of CPacketSender::SendPacket method
|
|
|