00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "stdafx.h"
00037 #include "UDPCrafter.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040 #include "Array_ptr.h"
00041
00042 #include <memory>
00043
00044 #ifdef _MEMORY_DEBUG
00045 #define new DEBUG_NEW
00046 #define malloc DEBUG_MALLOC
00047 static char THIS_FILE[] = __FILE__;
00048 #endif
00049
00050 KOMODIA_NAMESPACE_START
00051
00052 #define CUDPCrafter_Class "CUDPCrafter"
00053
00054 CUDPCrafter::CUDPCrafter() : CUDPSocket(TRUE),
00055 CIPCrafter()
00056 {
00057 try
00058 {
00059
00060 CUDPSocket::SetName(CUDPCrafter_Class);
00061
00062
00063 SetUDPDefault();
00064
00065
00066 SetProtocol(IPPROTO_UDP);
00067 }
00068 ERROR_HANDLER("CUDPCrafter")
00069 }
00070
00071 CUDPCrafter::~CUDPCrafter()
00072 {
00073 }
00074
00075 LPIpHeader CUDPCrafter::ConstructIPHeader(unsigned char ucProtocol,
00076 unsigned short usFragmentationFlags,
00077 unsigned char ucTTL,
00078 unsigned short usIdentification,
00079 unsigned char ucHeaderLength)const
00080 {
00081 return ConstructCraftedIPHeader(ucProtocol,
00082 usFragmentationFlags,
00083 ucTTL,
00084 usIdentification,
00085 ucHeaderLength);
00086 }
00087
00088 void CUDPCrafter::FinalIPHeader(LPIpHeader lpHead)const
00089 {
00090 try
00091 {
00092
00093 if (!m_DefaultChecksum)
00094 lpHead->usChecksum=htons(m_usChecksum);
00095 }
00096 ERROR_HANDLER("FinalIPHeader")
00097 }
00098
00099 void CUDPCrafter::SetUDPDefault()
00100 {
00101 try
00102 {
00103
00104 m_UDPDefaultChecksum=TRUE;
00105 }
00106 ERROR_HANDLER("SetUDPDefault")
00107 }
00108
00109 void CUDPCrafter::SetUDPChecksum(unsigned short usChecksum)
00110 {
00111 m_usUDPChecksum=usChecksum;
00112 }
00113
00114 void CUDPCrafter::SetUDPUseDefaultChecksum(BOOL bDefault)
00115 {
00116 m_UDPDefaultChecksum=bDefault;
00117 }
00118
00119 void CUDPCrafter::FinalUDPHeader(LPUDPHeader lpHeader)const
00120 {
00121 if (!m_UDPDefaultChecksum)
00122 lpHeader->usChecksum=htons(m_usUDPChecksum);
00123 }
00124
00125 char* CUDPCrafter::GetCraftedPacket(unsigned short usSourcePort,
00126 unsigned long ulDestinationAddress,
00127 const char* pBuffer,
00128 unsigned long ulBufferSizeBufferSize,
00129 unsigned short usDestinationPort,
00130 unsigned short& usTotalSize)const
00131 {
00132 try
00133 {
00134
00135 UDPHeader aHeader;
00136
00137
00138 aHeader.usSourcePort=htons(usSourcePort);
00139 aHeader.usDestinationPort=htons(usDestinationPort);
00140
00141
00142 aHeader.usChecksum=0;
00143
00144
00145 unsigned long ulTotalLength;
00146 ulTotalLength=UDPHeaderLength+ulBufferSizeBufferSize;
00147
00148
00149 aHeader.usLength=htons(ulTotalLength);
00150
00151
00152 char* pNewBuffer;
00153 pNewBuffer=new char[ulTotalLength];
00154
00155
00156 CArray_ptr<char> pProtection(pNewBuffer);
00157
00158
00159 memcpy(pNewBuffer,
00160 &aHeader,
00161 UDPHeaderLength);
00162
00163
00164 if (ulBufferSizeBufferSize)
00165 memcpy(pNewBuffer+UDPHeaderLength,
00166 pBuffer,
00167 ulBufferSizeBufferSize);
00168
00169
00170 aHeader.usChecksum=CalculatePseudoChecksum(pNewBuffer,
00171 ulTotalLength,
00172 ulDestinationAddress,
00173 ulTotalLength);
00174
00175
00176 memcpy(pNewBuffer,
00177 &aHeader,
00178 UDPHeaderLength);
00179
00180
00181 FinalUDPHeader((LPUDPHeader)pNewBuffer);
00182
00183
00184 return CIPCrafter::GetCraftedPacket(this,
00185 ulDestinationAddress,
00186 pNewBuffer,
00187 ulTotalLength,
00188 usTotalSize);
00189 }
00190 ERROR_HANDLER_RETURN("GetCraftedPacket",NULL)
00191 }
00192
00193 KOMODIA_NAMESPACE_END