windows-nt/Source/XPSP1/NT/net/ias/protocol/radius/packetsender.cpp

179 lines
4.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//#--------------------------------------------------------------
//
// 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