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 "UDPSocketAsync.h"
00038 
00039 #include "ErrorHandlerMacros.h"
00040 
00041 #ifdef _MEMORY_DEBUG 
00042     #define new    DEBUG_NEW  
00043     #define malloc DEBUG_MALLOC  
00044     static char THIS_FILE[] = __FILE__;  
00045 #endif
00046 
00047 KOMODIA_NAMESPACE_START
00048 
00049 #define CUDPSocketAsync_Class "CUDPSocketAsync"
00050 
00051 CUDPSocketAsync::CUDPSocketAsync(BOOL bRawSocket) : CUDPSocket(bRawSocket), 
00052                                                     CAsyncSocket()
00053 {
00054     try
00055     {
00056         
00057         SetName(CUDPSocketAsync_Class);
00058     }
00059     ERROR_HANDLER("CUDPSocketAsync")
00060 }
00061 
00062 CUDPSocketAsync::~CUDPSocketAsync()
00063 {
00064     try
00065     {
00066         
00067         Close();
00068     }
00069     ERROR_HANDLER("~CUDPSocketAsync")
00070 }
00071 
00072 BOOL CUDPSocketAsync::Listen()
00073 {
00074     try
00075     {
00076         
00077         if (!CheckSocketValid())
00078             return FALSE;
00079 
00080         
00081         int iResult;
00082         iResult=InternalWSAAsyncSelect(WM_SOCKET_GENERAL,
00083                                        FD_READ);
00084 
00085         
00086         if (iResult)
00087         {
00088             
00089             SetLastError("Listen");
00090 
00091             
00092             return FALSE;
00093         }
00094         else
00095             return TRUE;
00096     }
00097     ERROR_HANDLER_RETURN("Listen",FALSE)
00098 }
00099 
00100 BOOL CUDPSocketAsync::SetAsync()
00101 {
00102     try
00103     {
00104         
00105         if (!CheckSocketValid())
00106             return FALSE;
00107 
00108         
00109         int iResult;
00110         iResult=InternalWSAAsyncSelect(WM_SOCKET_GENERAL,
00111                                        FD_WRITE | FD_READ);
00112 
00113         
00114         if (iResult)
00115         {
00116             
00117             SetLastError("SetAsync");
00118 
00119             
00120             return FALSE;
00121         }
00122         else
00123             return TRUE;
00124     }
00125     ERROR_HANDLER_RETURN("SetAsync",FALSE)
00126 }
00127 
00128 BOOL CUDPSocketAsync::OnSocketConnect(int iErrorCode)
00129 {
00130     
00131     return SetAsync();
00132 }
00133 
00134 void CUDPSocketAsync::Accepted()
00135 {
00136     try
00137     {
00138         
00139         AddSocketToList();
00140 
00141         
00142         SetAsync();
00143     }
00144     ERROR_HANDLER("CTCPSocketAsync")
00145 }
00146 
00147 SOCKET CUDPSocketAsync::GetAsyncHandle()const
00148 {
00149     return GetHandle();
00150 }
00151 
00152 BOOL CUDPSocketAsync::Create()
00153 {
00154     try
00155     {
00156         if (!CUDPSocket::Create())
00157             return FALSE;
00158         else
00159         {
00160             
00161             AddSocketToList();
00162 
00163             
00164             return TRUE;
00165         }
00166     }
00167     ERROR_HANDLER_RETURN("Create",FALSE)
00168 }
00169 
00170 BOOL CUDPSocketAsync::Close()
00171 {
00172     try
00173     {
00174         
00175         if (!ValidSocket())
00176             return FALSE;
00177 
00178         
00179         CAsyncSocket::SocketClosing();
00180 
00181         
00182         RemoveSocketFromList();
00183 
00184         
00185         return CUDPSocket::Close();
00186     }
00187     ERROR_HANDLER_RETURN("Close",FALSE)
00188 }
00189 
00190 BOOL CUDPSocketAsync::Send(IP aDestinationAddress, 
00191                            unsigned short usDestinationPort,
00192                            const char* pBuffer,
00193                            unsigned short usBufferLength)
00194 {
00195     try
00196     {
00197         
00198         return CUDPSocket::Send(aDestinationAddress,
00199                                 usDestinationPort,
00200                                 pBuffer,
00201                                 usBufferLength);
00202     }
00203     ERROR_HANDLER_RETURN("Send",GetErrorCode())
00204 }
00205 
00206 BOOL CUDPSocketAsync::Send(const std::string& rDestinationAddress, 
00207                            unsigned short usDestinationPort,
00208                            const char* pBuffer,
00209                            unsigned short usBufferLength)
00210 {
00211     try
00212     {
00213         
00214         return CUDPSocket::Send(rDestinationAddress,
00215                                 usDestinationPort,
00216                                 pBuffer,
00217                                 usBufferLength);
00218     }
00219     ERROR_HANDLER_RETURN("Send",GetErrorCode())
00220 }
00221 
00222 KOMODIA_NAMESPACE_END