Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/SocketX.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (show annotations) (download) (as text)
Mon Jun 28 05:42:45 2010 UTC (13 years, 11 months ago) by sho1get
File MIME type: text/x-chdr
File size: 14222 byte(s)


1 #pragma once
2
3 /////////////////////////////////////////////////////////////////////////////////
4 //
5 // The MIT License
6 //
7 // Copyright (c) 2010 Yoshida Shoichi
8 // (yoshida.sho1@gmail.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to deal
12 // in the Software without restriction, including without limitation the rights
13 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 // copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be included in
18 // all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 // THE SOFTWARE.
27 //
28 /////////////////////////////////////////////////////////////////////////////////
29
30 #include <afx.h>
31 #include <afxwin.h>
32 #include <afxtempl.h> // For CArray
33 #include <afxmt.h> // For CCriticalSection
34
35 #include <WinSock2.h>
36 #include <MSTcpIP.h> // For tcp_keepalive, promiscuous
37 #include <memory> // For shard_ptr
38 #include "Config.h"
39
40 #pragma comment(lib, "ws2_32")
41
42 //////////////////////////////////////////////////////////////////////////
43
44 BOOL SocketXInitialize();
45
46 class ISocketCallback;
47 class IBaseSocket;
48 class CServerSocket;
49 class CClientSocket;
50 class CPeerSocket;
51 class CBcastSocket;
52 class CMcastSocket;
53 class CRawSocket;
54
55 typedef std::tr1::shared_ptr<CServerSocket> CServerSocketPtr;
56 typedef std::tr1::shared_ptr<CClientSocket> CClientSocketPtr;
57 typedef std::tr1::shared_ptr<CPeerSocket> CPeerSocketPtr;
58 typedef std::tr1::shared_ptr<CBcastSocket> CBcastSocketPtr;
59 typedef std::tr1::shared_ptr<CMcastSocket> CMcastSocketPtr;
60 typedef std::tr1::shared_ptr<CRawSocket> CRawSocketPtr;
61
62 typedef struct _NETADDR
63 {
64 union
65 {
66 DWORD dwAddress;
67 BYTE pat[4];
68 };
69 WORD wPort;
70 UINT nFamily;
71 }
72 NETADDR, *LPNETADDR;
73
74 typedef struct _LOCALNET
75 {
76 DWORD dwAddress;
77 DWORD dwMask;
78 DWORD dwNet;
79 }
80 LOCALNET, *LPLOCALNET;
81
82 typedef struct _IPv4
83 {
84 DWORD dwIndex;
85 DWORD dwAddress;
86 DWORD dwNetMask;
87 DWORD dwBcastAddress;
88 }
89 IPv4, *LPIPv4;
90
91 typedef struct _SOCKMSG
92 {
93 ISocketCallback *pCallback;
94 DWORD dwSocketID;
95 }
96 SOCKMSG, *LPSOCKMSG;
97
98 //////////////////////////////////////////////////////////////////////////
99
100 class ISocketCallback
101 {
102 public:
103 ISocketCallback() {}
104 virtual ~ISocketCallback() {}
105
106 // Message function
107 virtual void OnSocketSendMessage(DWORD dwSocketID) {}
108 virtual void OnSocketReceiveMessage(DWORD dwSocketID, NETADDR NetAddr, const CByteArray &data) {}
109 virtual void OnSocketReceiveFromMessage(DWORD dwSocketID, NETADDR NetAddr, const CByteArray &data) {}
110 virtual void OnSocketAcceptMessage(DWORD dwSocketID, NETADDR NetAddr) {}
111 virtual void OnSocketConnectMessage(DWORD dwSocketID, NETADDR NetAddr) {}
112 virtual void OnSocketCloseMessage(DWORD dwSocketID, NETADDR NetAddr) {}
113 virtual void OnGetHostByNameMessage(const LPHOSTENT lpHostEnt) {}
114 };
115
116 //////////////////////////////////////////////////////////////////////////
117
118 class CNetwork
119 {
120 public:
121 CNetwork();
122 virtual ~CNetwork();
123
124 BOOL GetIPv4List(DWORD &dwSize, DWORD dwMax, LPIPv4 lpList);
125 BOOL IsAvailable();
126 DWORD MakeBcastAddress(DWORD dwAddress, DWORD dwNetMask);
127 };
128
129 //////////////////////////////////////////////////////////////////////////
130
131 class CSocketHelper
132 {
133 public:
134 CSocketHelper();
135 virtual ~CSocketHelper();
136
137 void StringToByteArray(CByteArray &dst, const CString &src);
138 void ByteArrayToString(CString &dst, const CByteArray &src);
139 void Serialize(CByteArray &dst, const LPVOID src, DWORD dwSize);
140 };
141 //////////////////////////////////////////////////////////////////////////
142
143 // Interface class
144 class IBaseSocket : public CWnd
145 {
146 DECLARE_DYNAMIC(IBaseSocket)
147
148 public:
149 IBaseSocket();
150 virtual ~IBaseSocket();
151
152 virtual void OnAccept(SOCKET hSocket, int nErrorCode) {}
153 virtual void OnConnect(SOCKET hSocket, int nErrorCode) {}
154 virtual void OnClose(SOCKET hSocket, int nErrorCode) {}
155 virtual void OnSend(SOCKET hSocket, int nErrorCode) {}
156 virtual void OnReceive(SOCKET hSocket, int nErrorCode) {}
157
158 void SetCallback(SOCKMSG SockMsg) { m_SockMsg = SockMsg; }
159 void ConvertSockAddrToNetAddr(const LPSOCKADDR lpsAddr, NETADDR &NetAddr);
160 BOOL CloseSocket();
161 BOOL Send(const CByteArray &data);
162 BOOL Receive(CByteArray &data);
163 BOOL SendTo(const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
164 BOOL ReceiveFrom(CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
165 BOOL Shutdown(int nFlag);
166 BOOL AsyncSelect(LONG lEvent);
167 BOOL AsyncGetHostByName(const LPCSTR szHostName);
168 BOOL SetBlocking();
169 BOOL Bind(WORD wPort, DWORD dwAddress = INADDR_ANY);
170 BOOL GetSockName(LPSOCKADDR lpsAddr);
171 BOOL GetPeerName(LPSOCKADDR lpsAddr);
172 BOOL SetSockOpt(int nOptionName, LPCSTR lpOptionValue, int nOptionLen, int nLevel = SOL_SOCKET);
173 BOOL GetSockOpt(int nOptionName, LPSTR lpOptionValue, int *lpOptionLen, int nLevel = SOL_SOCKET);
174 BOOL SetSendTimeout(DWORD dwTimeout);
175 BOOL SetRecieveTimeout(DWORD dwTimeout);
176 BOOL SetSendBufferSize(DWORD dwBufSize);
177 BOOL SetReceiveBufferSize(DWORD dwBufSize);
178 BOOL SetBufferSize(DWORD dwBufSize);
179 BOOL SetKeepAlive(DWORD dwTime = SX_KA_TIME, DWORD dwInterval = SX_KA_INTERVAL);
180 BOOL SetReuseAddr(BOOL flag);
181 BOOL IOCtlSocket(LONG lCommand, DWORD *lpArgument);
182 BOOL WSAIOCtl(DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
183 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
184 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
185
186 void GetLocalAddress(NETADDR &NetAddr);
187 void GetPeerAddress(NETADDR &NetAddr);
188 void SetLocalNet(LOCALNET LocalNet) { m_LocalNet = LocalNet; }
189 void GetLocalNet(LOCALNET &LocalNet) { LocalNet = m_LocalNet; }
190 BOOL IsBlocking() { return m_fBlocking; }
191 LONG GetEvent() { return m_lEvent; }
192 DWORD GetError() { return m_dwError; }
193 DWORD GetSendTimeout() { return m_dwSendTimeout; }
194 DWORD GetReceiveTimeout() { return m_dwReceiveTimeout; }
195
196 protected:
197 DECLARE_MESSAGE_MAP()
198 afx_msg LRESULT OnSocketMessage(WPARAM wParam, LPARAM lParam);
199 afx_msg LRESULT OnGetHostMessage(WPARAM wParam, LPARAM lParam);
200
201 virtual BOOL CreateSocket(SOCKMSG SockMsg) = 0;
202
203 BOOL CreateSocketWindow();
204 BOOL IsLANConnection(const LPSOCKADDR lpsAddr);
205 void MakeSockAddrIN(LPSOCKADDR_IN lpsAddrIn, DWORD dwAddress, WORD wPort, UINT nFamily = AF_INET);
206
207 BOOL doCreateSocket(SOCKMSG SockMsg, int nType, int nProtocol);
208 BOOL doCloseSocket(SOCKET hSocket);
209 BOOL doGetHostByName(HANDLE hTask, int nErrorCode);
210 BOOL doSend(SOCKET hSocket, const CByteArray &data);
211 BOOL doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
212 BOOL doReceive(SOCKET hSocket, CByteArray &data);
213 BOOL doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
214 BOOL doSetSendTimeout(SOCKET hSocket, DWORD dwTimeout);
215 BOOL doSetReceiveTimeout(SOCKET hSocket, DWORD dwTimeout);
216 BOOL doSetSendBufferSize(SOCKET hSocket, DWORD dwBufSize);
217 BOOL doSetReceiveBufferSize(SOCKET hSocket, DWORD dwBufSize);
218 BOOL doShutdown(SOCKET hSocket, int nFlag);
219 BOOL doAsyncSelect(SOCKET hSocket, UINT uMsg, LONG lEvent);
220 BOOL doAsyncGetHostByName(UINT uMsg, const LPCSTR szHostName, LPSTR szHostEnt, int nBufLen);
221 BOOL doSetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPCSTR lpOptionValue, int nOptionLen);
222 BOOL doGetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPSTR lpOptionValue, int *lpOptionLen);
223 BOOL doSetBlocking(SOCKET hSocket);
224 BOOL doSetKeepAlive(SOCKET hSocket, DWORD dwKaTime, DWORD dwInterval);
225 BOOL doBind(SOCKET hSocket, WORD wPort, DWORD dwAddress);
226 BOOL doGetSockName(SOCKET hSocket, LPSOCKADDR lpsAddr);
227 BOOL doGetPeerName(SOCKET hSocket, LPSOCKADDR lpsAddr);
228 BOOL doSetReuseAddr(SOCKET hSocket, BOOL flag);
229 BOOL doIOCtlSocket(SOCKET hSocket, LONG lCommand, DWORD *lpArgument);
230 BOOL doWSAIOCtl(SOCKET hSocket, DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
231 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
232 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
233
234 #ifdef _DEBUG
235 CString DwToIPAddress(DWORD dwAddress)
236 {
237 CString cs;
238 dwAddress = htonl(dwAddress);
239 cs.Format(_T("%d.%d.%d.%d"),
240 (dwAddress >> 24) & 0xff,
241 (dwAddress >> 16) & 0xff,
242 (dwAddress >> 8) & 0xff,
243 dwAddress & 0xff);
244 return cs;
245 }
246 #endif
247
248 protected:
249 typedef struct _HEADER
250 {
251 size_t size;
252 size_t pad;
253 WORD flags;
254 }
255 HEADER, *LPHEADER;
256
257 typedef struct _SOCKETDATA
258 {
259 SOCKET hSocket;
260 NETADDR NetAddr;
261 }
262 SOCKETDATA, *LPSOCKETDATA;
263
264 typedef struct _HOSTNAME
265 {
266 HANDLE hTask;
267 CHAR buf[MAXGETHOSTSTRUCT];
268 }
269 HOSTNAME, *LPHOSTNAME;
270
271 protected:
272 LOCALNET m_LocalNet;
273 HOSTNAME m_HostName;
274 SOCKADDR m_PeerAddr;
275 SOCKADDR m_LocalAddr;
276 SOCKMSG m_SockMsg;
277 SOCKET m_hSocket;
278 DWORD m_dwError;
279 DWORD m_dwSendTimeout;
280 DWORD m_dwReceiveTimeout;
281 DWORD m_dwSendBufSize;
282 DWORD m_dwReceiveBufSize;
283 LONG m_lEvent;
284 WORD m_wBindPort;
285 BOOL m_fBlocking;
286 BOOL m_fWnd;
287 BOOL m_fInit;
288 };
289
290 //////////////////////////////////////////////////////////////////////////
291
292 class CServerSocket : public IBaseSocket
293 {
294 DECLARE_DYNAMIC(CServerSocket)
295
296 public:
297 CServerSocket();
298 virtual ~CServerSocket();
299
300 virtual void OnAccept(SOCKET hSocket, int nErrorCode);
301 virtual void OnClose(SOCKET hSocket, int nErrorCode);
302 virtual void OnSend(SOCKET hSocket, int nErrorCode);
303 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
304
305 BOOL Initialize(SOCKMSG SockMsg, WORD wPort, DWORD dwBindAddress = INADDR_ANY, int nBacklog = 5);
306 BOOL Accept(LPSOCKADDR lpsAddr, int *lpsAddrLen);
307 BOOL Listen(int nBacklog = 5);
308 BOOL Broadcast(const CByteArray &data);
309 BOOL SendToClient(const CByteArray &data, DWORD dwAddress, WORD wPort);
310
311 void SetAccept(BOOL fAccept);
312 BOOL GetAccept() { return m_fAccept; }
313 void SetConnectionMode(BOOL fInternet) { m_fInternet = fInternet; }
314 BOOL GetConnectionMode() { return m_fInternet; }
315
316 protected:
317 virtual BOOL CreateSocket(SOCKMSG SockMsg);
318
319 int SearchSocketConnection(SOCKET hSocket);
320 void AddConnection(SOCKET hSocket, const LPSOCKADDR lpsAddr, int nSockAddrLen);
321 void CloseAllSocketConnection();
322 BOOL ServerReceive(SOCKET hSocket);
323 BOOL CloseSocketConnection(SOCKET hSocket, LPNETADDR lpNetAddr);
324 SOCKET GetSocketHandle(DWORD dwAddress, WORD wPort);
325
326 protected:
327 typedef CArray<SOCKETDATA> SocketDataArray;
328
329 typedef struct _AtmSDArray
330 {
331 SocketDataArray list;
332 CCriticalSection cs;
333 }
334 AtmSDArray, *LPAtmSDArray;
335
336 AtmSDArray m_sdList;
337 BOOL m_fAccept;
338 BOOL m_fInternet;
339 };
340
341 //////////////////////////////////////////////////////////////////////////
342
343 class CClientSocket : public IBaseSocket
344 {
345 DECLARE_DYNAMIC(CClientSocket)
346
347 public:
348 CClientSocket();
349 virtual ~CClientSocket();
350
351 virtual void OnConnect(SOCKET hSocket, int nErrorCode);
352 virtual void OnClose(SOCKET hSocket, int nErrorCode);
353 virtual void OnSend(SOCKET hSocket, int nErrorCode);
354 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
355
356 BOOL Initialize(SOCKMSG SockMsg);
357 BOOL AsyncConnect(const LPSOCKADDR lpDstAddr, int nLength);
358 BOOL AsyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength);
359 BOOL SyncConnect(const LPSOCKADDR lpDstAddr, int nLength, DWORD dwTimeout);
360 BOOL SyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength, DWORD dwTimeout);
361
362 protected:
363 virtual BOOL CreateSocket(SOCKMSG SockMsg);
364 };
365
366 //////////////////////////////////////////////////////////////////////////
367
368 class CPeerSocket : public IBaseSocket
369 {
370 DECLARE_DYNAMIC(CPeerSocket)
371
372 public:
373 CPeerSocket();
374 virtual ~CPeerSocket();
375
376 virtual void OnClose(SOCKET hSocket, int nErrorCode);
377 virtual void OnSend(SOCKET hSocket, int nErrorCode);
378 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
379 virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
380
381 protected:
382 virtual BOOL CreateSocket(SOCKMSG SockMsg);
383 };
384
385 //////////////////////////////////////////////////////////////////////////
386
387 class CBcastSocket : public CPeerSocket
388 {
389 DECLARE_DYNAMIC(CBcastSocket)
390
391 public:
392 CBcastSocket();
393 virtual ~CBcastSocket();
394
395 BOOL SetBroadcast(DWORD dwLocalAddress, DWORD dwMaskAddress, WORD wPort);
396 BOOL SetBroadcast(DWORD dwBcastAddress, WORD wPort);
397 BOOL ResetBroadcast();
398 BOOL Broadcast(const CByteArray &data);
399
400 protected:
401 SOCKADDR m_BcastAddr;
402 BOOL m_fBcast;
403 };
404
405 //////////////////////////////////////////////////////////////////////////
406
407 class CMcastSocket : public CPeerSocket
408 {
409 DECLARE_DYNAMIC(CMcastSocket)
410
411 public:
412 CMcastSocket();
413 virtual ~CMcastSocket();
414
415 BOOL SetReceiveMulticast(DWORD dwMcastAddress);
416 BOOL AddMembership(DWORD dwMcastAddress, WORD wPort);
417 BOOL DropMembership();
418 BOOL SetTTL(DWORD dwTTL);
419 BOOL Multicast(const CByteArray &data);
420
421 protected:
422 SOCKADDR m_McastAddr;
423 BOOL m_fMcast;
424 };
425
426 //////////////////////////////////////////////////////////////////////////
427
428 class CRawSocket : public CPeerSocket
429 {
430 DECLARE_DYNAMIC(CRawSocket)
431
432 public:
433 CRawSocket();
434 virtual ~CRawSocket();
435
436 virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
437
438 BOOL SetPromiscuous(BOOL flag);
439
440 protected:
441 virtual BOOL CreateSocket(SOCKMSG SockMsg);
442
443 protected:
444 BOOL m_fPromiscuous;
445 };
446
447 //////////////////////////////////////////////////////////////////////////]

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26