Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/SocketX.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (show annotations) (download) (as text)
Mon Jun 28 05:40:57 2010 UTC (13 years, 9 months ago) by sho1get
File MIME type: text/x-chdr
File size: 14187 byte(s)
Update_20100628
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 DWORD dwAddress;
65 WORD wPort;
66 UINT nFamily;
67 }
68 NETADDR, *LPNETADDR;
69
70 typedef struct _LOCALNET
71 {
72 DWORD dwAddress;
73 DWORD dwMask;
74 DWORD dwNet;
75 }
76 LOCALNET, *LPLOCALNET;
77
78 typedef struct _IPv4
79 {
80 DWORD dwIndex;
81 DWORD dwAddress;
82 DWORD dwNetMask;
83 DWORD dwBcastAddress;
84 }
85 IPv4, *LPIPv4;
86
87 typedef struct _SOCKMSG
88 {
89 ISocketCallback *pCallback;
90 DWORD dwSocketID;
91 }
92 SOCKMSG, *LPSOCKMSG;
93
94 //////////////////////////////////////////////////////////////////////////
95
96 class ISocketCallback
97 {
98 public:
99 ISocketCallback() {}
100 virtual ~ISocketCallback() {}
101
102 // Message function
103 virtual void OnSocketSendMessage(DWORD dwSocketID) {}
104 virtual void OnSocketReceiveMessage(DWORD dwSocketID, NETADDR NetAddr, const CByteArray &data) {}
105 virtual void OnSocketReceiveFromMessage(DWORD dwSocketID, NETADDR NetAddr, const CByteArray &data) {}
106 virtual void OnSocketAcceptMessage(DWORD dwSocketID, NETADDR NetAddr) {}
107 virtual void OnSocketConnectMessage(DWORD dwSocketID, NETADDR NetAddr) {}
108 virtual void OnSocketCloseMessage(DWORD dwSocketID, NETADDR NetAddr) {}
109 virtual void OnGetHostByNameMessage(const LPHOSTENT lpHostEnt) {}
110 };
111
112 //////////////////////////////////////////////////////////////////////////
113
114 class CNetwork
115 {
116 public:
117 CNetwork();
118 virtual ~CNetwork();
119
120 BOOL GetIPv4List(DWORD &dwSize, DWORD dwMax, LPIPv4 lpList);
121 BOOL IsAvailable();
122 DWORD MakeBcastAddress(DWORD dwAddress, DWORD dwNetMask);
123 };
124
125 //////////////////////////////////////////////////////////////////////////
126
127 class CSocketHelper
128 {
129 public:
130 CSocketHelper();
131 virtual ~CSocketHelper();
132
133 void StringToByteArray(CByteArray &dst, const CString &src);
134 void ByteArrayToString(CString &dst, const CByteArray &src);
135 void Serialize(CByteArray &dst, const LPVOID src, DWORD dwSize);
136 };
137 //////////////////////////////////////////////////////////////////////////
138
139 // Interface class
140 class IBaseSocket : public CWnd
141 {
142 DECLARE_DYNAMIC(IBaseSocket)
143
144 public:
145 IBaseSocket();
146 virtual ~IBaseSocket();
147
148 virtual void OnAccept(SOCKET hSocket, int nErrorCode) {}
149 virtual void OnConnect(SOCKET hSocket, int nErrorCode) {}
150 virtual void OnClose(SOCKET hSocket, int nErrorCode) {}
151 virtual void OnSend(SOCKET hSocket, int nErrorCode) {}
152 virtual void OnReceive(SOCKET hSocket, int nErrorCode) {}
153
154 void SetCallback(SOCKMSG SockMsg) { m_SockMsg = SockMsg; }
155 void ConvertSockAddrToNetAddr(const LPSOCKADDR lpsAddr, NETADDR &NetAddr);
156 BOOL CloseSocket();
157 BOOL Send(const CByteArray &data);
158 BOOL Receive(CByteArray &data);
159 BOOL SendTo(const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
160 BOOL ReceiveFrom(CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
161 BOOL Shutdown(int nFlag);
162 BOOL AsyncSelect(LONG lEvent);
163 BOOL AsyncGetHostByName(const LPCSTR szHostName);
164 BOOL SetBlocking();
165 BOOL Bind(WORD wPort, DWORD dwAddress = INADDR_ANY);
166 BOOL GetSockName(LPSOCKADDR lpsAddr);
167 BOOL GetPeerName(LPSOCKADDR lpsAddr);
168 BOOL SetSockOpt(int nOptionName, LPCSTR lpOptionValue, int nOptionLen, int nLevel = SOL_SOCKET);
169 BOOL GetSockOpt(int nOptionName, LPSTR lpOptionValue, int *lpOptionLen, int nLevel = SOL_SOCKET);
170 BOOL SetSendTimeout(DWORD dwTimeout);
171 BOOL SetRecieveTimeout(DWORD dwTimeout);
172 BOOL SetSendBufferSize(DWORD dwBufSize);
173 BOOL SetReceiveBufferSize(DWORD dwBufSize);
174 BOOL SetBufferSize(DWORD dwBufSize);
175 BOOL SetKeepAlive(DWORD dwTime = SX_KA_TIME, DWORD dwInterval = SX_KA_INTERVAL);
176 BOOL SetReuseAddr(BOOL flag);
177 BOOL IOCtlSocket(LONG lCommand, DWORD *lpArgument);
178 BOOL WSAIOCtl(DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
179 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
180 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
181
182 void GetLocalAddress(NETADDR &NetAddr);
183 void GetPeerAddress(NETADDR &NetAddr);
184 void SetLocalNet(LOCALNET LocalNet) { m_LocalNet = LocalNet; }
185 void GetLocalNet(LOCALNET &LocalNet) { LocalNet = m_LocalNet; }
186 BOOL IsBlocking() { return m_fBlocking; }
187 LONG GetEvent() { return m_lEvent; }
188 DWORD GetError() { return m_dwError; }
189 DWORD GetSendTimeout() { return m_dwSendTimeout; }
190 DWORD GetReceiveTimeout() { return m_dwReceiveTimeout; }
191
192 protected:
193 DECLARE_MESSAGE_MAP()
194 afx_msg LRESULT OnSocketMessage(WPARAM wParam, LPARAM lParam);
195 afx_msg LRESULT OnGetHostMessage(WPARAM wParam, LPARAM lParam);
196
197 virtual BOOL CreateSocket(SOCKMSG SockMsg) = 0;
198
199 BOOL CreateSocketWindow();
200 BOOL IsLANConnection(const LPSOCKADDR lpsAddr);
201 void MakeSockAddrIN(LPSOCKADDR_IN lpsAddrIn, DWORD dwAddress, WORD wPort, UINT nFamily = AF_INET);
202
203 BOOL doCreateSocket(SOCKMSG SockMsg, int nType, int nProtocol);
204 BOOL doCloseSocket(SOCKET hSocket);
205 BOOL doGetHostByName(HANDLE hTask, int nErrorCode);
206 BOOL doSend(SOCKET hSocket, const CByteArray &data);
207 BOOL doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
208 BOOL doReceive(SOCKET hSocket, CByteArray &data);
209 BOOL doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
210 BOOL doSetSendTimeout(SOCKET hSocket, DWORD dwTimeout);
211 BOOL doSetReceiveTimeout(SOCKET hSocket, DWORD dwTimeout);
212 BOOL doSetSendBufferSize(SOCKET hSocket, DWORD dwBufSize);
213 BOOL doSetReceiveBufferSize(SOCKET hSocket, DWORD dwBufSize);
214 BOOL doShutdown(SOCKET hSocket, int nFlag);
215 BOOL doAsyncSelect(SOCKET hSocket, UINT uMsg, LONG lEvent);
216 BOOL doAsyncGetHostByName(UINT uMsg, const LPCSTR szHostName, LPSTR szHostEnt, int nBufLen);
217 BOOL doSetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPCSTR lpOptionValue, int nOptionLen);
218 BOOL doGetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPSTR lpOptionValue, int *lpOptionLen);
219 BOOL doSetBlocking(SOCKET hSocket);
220 BOOL doSetKeepAlive(SOCKET hSocket, DWORD dwKaTime, DWORD dwInterval);
221 BOOL doBind(SOCKET hSocket, WORD wPort, DWORD dwAddress);
222 BOOL doGetSockName(SOCKET hSocket, LPSOCKADDR lpsAddr);
223 BOOL doGetPeerName(SOCKET hSocket, LPSOCKADDR lpsAddr);
224 BOOL doSetReuseAddr(SOCKET hSocket, BOOL flag);
225 BOOL doIOCtlSocket(SOCKET hSocket, LONG lCommand, DWORD *lpArgument);
226 BOOL doWSAIOCtl(SOCKET hSocket, DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
227 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
228 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
229
230 #ifdef _DEBUG
231 CString DwToIPAddress(DWORD dwAddress)
232 {
233 CString cs;
234 dwAddress = htonl(dwAddress);
235 cs.Format(_T("%d.%d.%d.%d"),
236 (dwAddress >> 24) & 0xff,
237 (dwAddress >> 16) & 0xff,
238 (dwAddress >> 8) & 0xff,
239 dwAddress & 0xff);
240 return cs;
241 }
242 #endif
243
244 protected:
245 typedef struct _HEADER
246 {
247 size_t size;
248 size_t pad;
249 WORD flags;
250 }
251 HEADER, *LPHEADER;
252
253 typedef struct _SOCKETDATA
254 {
255 SOCKET hSocket;
256 NETADDR NetAddr;
257 }
258 SOCKETDATA, *LPSOCKETDATA;
259
260 typedef struct _HOSTNAME
261 {
262 HANDLE hTask;
263 CHAR buf[MAXGETHOSTSTRUCT];
264 }
265 HOSTNAME, *LPHOSTNAME;
266
267 protected:
268 LOCALNET m_LocalNet;
269 HOSTNAME m_HostName;
270 SOCKADDR m_PeerAddr;
271 SOCKADDR m_LocalAddr;
272 SOCKMSG m_SockMsg;
273 SOCKET m_hSocket;
274 DWORD m_dwError;
275 DWORD m_dwSendTimeout;
276 DWORD m_dwReceiveTimeout;
277 DWORD m_dwSendBufSize;
278 DWORD m_dwReceiveBufSize;
279 LONG m_lEvent;
280 WORD m_wBindPort;
281 BOOL m_fBlocking;
282 BOOL m_fWnd;
283 BOOL m_fInit;
284 };
285
286 //////////////////////////////////////////////////////////////////////////
287
288 class CServerSocket : public IBaseSocket
289 {
290 DECLARE_DYNAMIC(CServerSocket)
291
292 public:
293 CServerSocket();
294 virtual ~CServerSocket();
295
296 virtual void OnAccept(SOCKET hSocket, int nErrorCode);
297 virtual void OnClose(SOCKET hSocket, int nErrorCode);
298 virtual void OnSend(SOCKET hSocket, int nErrorCode);
299 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
300
301 BOOL Initialize(SOCKMSG SockMsg, WORD wPort, DWORD dwBindAddress = INADDR_ANY, int nBacklog = 5);
302 BOOL Accept(LPSOCKADDR lpsAddr, int *lpsAddrLen);
303 BOOL Listen(int nBacklog = 5);
304 BOOL Broadcast(const CByteArray &data);
305 BOOL SendToClient(const CByteArray &data, DWORD dwAddress, WORD wPort);
306
307 void SetAccept(BOOL fAccept);
308 BOOL GetAccept() { return m_fAccept; }
309 void SetConnectionMode(BOOL fInternet) { m_fInternet = fInternet; }
310 BOOL GetConnectionMode() { return m_fInternet; }
311
312 protected:
313 virtual BOOL CreateSocket(SOCKMSG SockMsg);
314
315 int SearchSocketConnection(SOCKET hSocket);
316 void AddConnection(SOCKET hSocket, const LPSOCKADDR lpsAddr, int nSockAddrLen);
317 void CloseAllSocketConnection();
318 BOOL ServerReceive(SOCKET hSocket);
319 BOOL CloseSocketConnection(SOCKET hSocket, LPNETADDR lpNetAddr);
320 SOCKET GetSocketHandle(DWORD dwAddress, WORD wPort);
321
322 protected:
323 typedef CArray<SOCKETDATA> SocketDataArray;
324
325 typedef struct _AtmSDArray
326 {
327 SocketDataArray list;
328 CCriticalSection cs;
329 }
330 AtmSDArray, *LPAtmSDArray;
331
332 AtmSDArray m_sdList;
333 BOOL m_fAccept;
334 BOOL m_fInternet;
335 };
336
337 //////////////////////////////////////////////////////////////////////////
338
339 class CClientSocket : public IBaseSocket
340 {
341 DECLARE_DYNAMIC(CClientSocket)
342
343 public:
344 CClientSocket();
345 virtual ~CClientSocket();
346
347 virtual void OnConnect(SOCKET hSocket, int nErrorCode);
348 virtual void OnClose(SOCKET hSocket, int nErrorCode);
349 virtual void OnSend(SOCKET hSocket, int nErrorCode);
350 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
351
352 BOOL Initialize(SOCKMSG SockMsg);
353 BOOL AsyncConnect(const LPSOCKADDR lpDstAddr, int nLength);
354 BOOL AsyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength);
355 BOOL SyncConnect(const LPSOCKADDR lpDstAddr, int nLength, DWORD dwTimeout);
356 BOOL SyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength, DWORD dwTimeout);
357
358 protected:
359 virtual BOOL CreateSocket(SOCKMSG SockMsg);
360 };
361
362 //////////////////////////////////////////////////////////////////////////
363
364 class CPeerSocket : public IBaseSocket
365 {
366 DECLARE_DYNAMIC(CPeerSocket)
367
368 public:
369 CPeerSocket();
370 virtual ~CPeerSocket();
371
372 virtual void OnClose(SOCKET hSocket, int nErrorCode);
373 virtual void OnSend(SOCKET hSocket, int nErrorCode);
374 virtual void OnReceive(SOCKET hSocket, int nErrorCode);
375 virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
376
377 protected:
378 virtual BOOL CreateSocket(SOCKMSG SockMsg);
379 };
380
381 //////////////////////////////////////////////////////////////////////////
382
383 class CBcastSocket : public CPeerSocket
384 {
385 DECLARE_DYNAMIC(CBcastSocket)
386
387 public:
388 CBcastSocket();
389 virtual ~CBcastSocket();
390
391 BOOL SetBroadcast(DWORD dwLocalAddress, DWORD dwMaskAddress, WORD wPort);
392 BOOL SetBroadcast(DWORD dwBcastAddress, WORD wPort);
393 BOOL ResetBroadcast();
394 BOOL Broadcast(const CByteArray &data);
395
396 protected:
397 SOCKADDR m_BcastAddr;
398 BOOL m_fBcast;
399 };
400
401 //////////////////////////////////////////////////////////////////////////
402
403 class CMcastSocket : public CPeerSocket
404 {
405 DECLARE_DYNAMIC(CMcastSocket)
406
407 public:
408 CMcastSocket();
409 virtual ~CMcastSocket();
410
411 BOOL SetReceiveMulticast(DWORD dwMcastAddress);
412 BOOL AddMembership(DWORD dwMcastAddress, WORD wPort);
413 BOOL DropMembership();
414 BOOL SetTTL(DWORD dwTTL);
415 BOOL Multicast(const CByteArray &data);
416
417 protected:
418 SOCKADDR m_McastAddr;
419 BOOL m_fMcast;
420 };
421
422 //////////////////////////////////////////////////////////////////////////
423
424 class CRawSocket : public CPeerSocket
425 {
426 DECLARE_DYNAMIC(CRawSocket)
427
428 public:
429 CRawSocket();
430 virtual ~CRawSocket();
431
432 virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
433
434 BOOL SetPromiscuous(BOOL flag);
435
436 protected:
437 virtual BOOL CreateSocket(SOCKMSG SockMsg);
438
439 protected:
440 BOOL m_fPromiscuous;
441 };
442
443 //////////////////////////////////////////////////////////////////////////]

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