Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/SocketX.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (hide 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 sho1get 11 #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 sho1get 13 #include "Config.h"
39 sho1get 11
40     #pragma comment(lib, "ws2_32")
41    
42     //////////////////////////////////////////////////////////////////////////
43    
44     BOOL SocketXInitialize();
45    
46 sho1get 16 class ISocketCallback;
47 sho1get 11 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 sho1get 16 UINT nFamily;
67 sho1get 11 }
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 sho1get 16 ISocketCallback *pCallback;
90     DWORD dwSocketID;
91 sho1get 11 }
92     SOCKMSG, *LPSOCKMSG;
93    
94     //////////////////////////////////////////////////////////////////////////
95    
96 sho1get 16 class ISocketCallback
97 sho1get 11 {
98     public:
99 sho1get 16 ISocketCallback() {}
100     virtual ~ISocketCallback() {}
101 sho1get 11
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 sho1get 16 void SetCallback(SOCKMSG SockMsg) { m_SockMsg = SockMsg; }
155     void ConvertSockAddrToNetAddr(const LPSOCKADDR lpsAddr, NETADDR &NetAddr);
156 sho1get 11 BOOL CloseSocket();
157     BOOL Send(const CByteArray &data);
158     BOOL Receive(CByteArray &data);
159 sho1get 16 BOOL SendTo(const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
160     BOOL ReceiveFrom(CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
161 sho1get 11 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 sho1get 16 BOOL GetSockName(LPSOCKADDR lpsAddr);
167     BOOL GetPeerName(LPSOCKADDR lpsAddr);
168 sho1get 11 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 sho1get 16 BOOL SetBufferSize(DWORD dwBufSize);
175 sho1get 11 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 sho1get 16 BOOL IsLANConnection(const LPSOCKADDR lpsAddr);
201     void MakeSockAddrIN(LPSOCKADDR_IN lpsAddrIn, DWORD dwAddress, WORD wPort, UINT nFamily = AF_INET);
202 sho1get 11
203 sho1get 16 BOOL doCreateSocket(SOCKMSG SockMsg, int nType, int nProtocol);
204 sho1get 11 BOOL doCloseSocket(SOCKET hSocket);
205 sho1get 13 BOOL doGetHostByName(HANDLE hTask, int nErrorCode);
206 sho1get 11 BOOL doSend(SOCKET hSocket, const CByteArray &data);
207 sho1get 16 BOOL doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen);
208 sho1get 11 BOOL doReceive(SOCKET hSocket, CByteArray &data);
209 sho1get 16 BOOL doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen);
210 sho1get 11 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 sho1get 16 BOOL doGetSockName(SOCKET hSocket, LPSOCKADDR lpsAddr);
223     BOOL doGetPeerName(SOCKET hSocket, LPSOCKADDR lpsAddr);
224 sho1get 11 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 sho1get 13 size_t pad;
249     WORD flags;
250 sho1get 11 }
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 sho1get 16 DWORD m_dwSendBufSize;
278     DWORD m_dwReceiveBufSize;
279 sho1get 11 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 sho1get 16 BOOL Accept(LPSOCKADDR lpsAddr, int *lpsAddrLen);
303 sho1get 11 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 sho1get 16 void AddConnection(SOCKET hSocket, const LPSOCKADDR lpsAddr, int nSockAddrLen);
317 sho1get 11 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 sho1get 16 BOOL AddMembership(DWORD dwMcastAddress, WORD wPort);
413     BOOL DropMembership();
414 sho1get 11 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