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 #if !defined(AFX_DNSSOCKET_H__98A94FC0_D2BC_4F00_9DF4_CC706F156B06__INCLUDED_)
00037 #define AFX_DNSSOCKET_H__98A94FC0_D2BC_4F00_9DF4_CC706F156B06__INCLUDED_
00038
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042
00043 #include "ErrorHandler.h"
00044
00045 #include "UDPSocketAsync.h"
00046
00047 #include <string>
00048 #include <deque>
00049
00050 class CThreadPool;
00051 class CGenericCriticalSection;
00052
00053 namespace KomodiaDNS
00054 {
00055
00056 #define INITIAL_TIMEOUT 5000
00057
00058 class CDNSManager;
00059 class CDNSTCPSocket;
00060 class CDNSUDPSocket;
00061 class CDNSAnswers;
00062
00063 class CDNSSocket : public CErrorHandler
00064 {
00065 friend class CDNSTCPSocket;
00066 friend class CDNSUDPSocket;
00067 public:
00068
00069 CThreadPool* GetThreadManager()const;
00070
00071
00072 CDNSAnswers* Receive();
00073
00074
00075 BOOL Initialize();
00076
00077
00078 void SetMultithreaded(int iThreadNumber);
00079 void SetMultithreaded(CThreadPool* pThreadManager);
00080
00081
00082 CDNSAnswers* SocketReceive(char* pBuffer,
00083 int iBufferLengh,
00084 BOOL bTCP=FALSE);
00085
00086
00087 CDNSAnswers* ParseAnswer(char* pBuffer,
00088 char* pOriginalBuffer,
00089 int iBufferLengh,
00090 BOOL bFromThread=FALSE,
00091 BOOL bTCP=FALSE);
00092
00093
00094 BOOL SetConnectionTimeout(int iMS);
00095
00096
00097 BOOL Send(const char *pBuffer,
00098 unsigned short bufLen,
00099 LPVOID lpLocalIDData);
00100
00101
00102 CDNSSocket(CDNSManager* pFather,
00103 const std::string strDNSServer,
00104 BOOL bTCP,
00105 BOOL bAsync,
00106 BOOL bAsyncConnect);
00107 virtual ~CDNSSocket();
00108 private:
00109
00110 typedef struct _ParseThreadData
00111 {
00112 char* pData;
00113 char* pOriginalData;
00114 int iDataSize;
00115 CDNSSocket* pSocket;
00116 BOOL bTCP;
00117 } ParseThreadData;
00118
00119
00120 typedef struct _WaitingRequests
00121 {
00122 char* pData;
00123 unsigned short usSize;
00124 LPVOID lpData;
00125 } WaitingRequests;
00126
00127
00128 typedef enum _ConnectionStatus
00129 {
00130 csNone,
00131 csPending,
00132 csConnected,
00133 csError,
00134 csDisconnected
00135 } ConnectionStatus;
00136
00137
00138 typedef std::deque<WaitingRequests> PendingDeque;
00139 private:
00140
00141 CDNSSocket(const CDNSSocket& rSocket);
00142
00143
00144 CDNSSocket& operator=(const CDNSSocket& rSocket);
00145
00146
00147 void SocketError(int iErrorCode);
00148 void SocketConnected(int iErrorCode);
00149 void SocketClosed();
00150
00151
00152 void SetConnectionStatus(ConnectionStatus aStatus);
00153
00154
00155 static void ThreadProc(LPVOID lpParam);
00156
00157
00158 void AddData(const char* pData,
00159 unsigned short usSize,
00160 LPVOID lpData);
00161
00162
00163 WaitingRequests GetData()const;
00164
00165
00166 BOOL Flush();
00167
00168
00169 static void DeleteProc(WaitingRequests& rRequest);
00170
00171
00172 BOOL m_bUseTCP;
00173 BOOL m_bAsync;
00174 BOOL m_bAsyncConnect;
00175
00176
00177 int m_iTimeout;
00178
00179
00180 CDNSManager* m_pFather;
00181
00182
00183 CDNSTCPSocket* m_pTCP;
00184 CDNSUDPSocket* m_pUDP;
00185
00186
00187 std::string m_strDNSServer;
00188
00189
00190 CThreadPool* m_pThreadManager;
00191
00192
00193 CGenericCriticalSection* m_pCSection;
00194
00195
00196 CGenericCriticalSection* m_pCSectionDeque;
00197
00198
00199 BOOL m_bOwners;
00200
00201
00202 ConnectionStatus m_aConnectionStatus;
00203
00204
00205 mutable PendingDeque m_aPendingData;
00206 };
00207
00208
00209 }
00210
00211 #endif // !defined(AFX_DNSSOCKET_H__98A94FC0_D2BC_4F00_9DF4_CC706F156B06__INCLUDED_)