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