Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/SocketX.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide annotations) (download) (as text)
Tue May 25 06:54:25 2010 UTC (13 years, 10 months ago) by sho1get
File MIME type: text/x-chdr
File size: 14075 byte(s)


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     class ISocketMessage;
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 nAF;
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     ISocketMessage *pTgtObj;
90     DWORD dwSocketID;
91     }
92     SOCKMSG, *LPSOCKMSG;
93    
94     //////////////////////////////////////////////////////////////////////////
95    
96     class ISocketMessage
97     {
98     public:
99     ISocketMessage() {}
100 sho1get 13 virtual ~ISocketMessage() {}
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     void SetTargetWnd(SOCKMSG SockMsg) { m_SockMsg = SockMsg; }
155     void ConvertSockAddrToNetAddr(const LPSOCKADDR lpSockAddr, NETADDR &NetAddr);
156     BOOL CloseSocket();
157     BOOL Send(const CByteArray &data);
158     BOOL Receive(CByteArray &data);
159     BOOL SendTo(const CByteArray &data, const LPSOCKADDR lpSockAddr, int nSockAddrLen);
160     BOOL ReceiveFrom(CByteArray &data, LPSOCKADDR lpSockAddr, int *lpSockAddrLen);
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 lpSockAddr);
167     BOOL GetPeerName(LPSOCKADDR lpSockAddr);
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 SetKeepAlive(DWORD dwTime = SX_KA_TIME, DWORD dwInterval = SX_KA_INTERVAL);
175     BOOL SetReuseAddr(BOOL flag);
176     BOOL IOCtlSocket(LONG lCommand, DWORD *lpArgument);
177     BOOL WSAIOCtl(DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
178     DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
179     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
180    
181     void GetLocalAddress(NETADDR &NetAddr);
182     void GetPeerAddress(NETADDR &NetAddr);
183     void SetLocalNet(LOCALNET LocalNet) { m_LocalNet = LocalNet; }
184     void GetLocalNet(LOCALNET &LocalNet) { LocalNet = m_LocalNet; }
185     BOOL IsBlocking() { return m_fBlocking; }
186     LONG GetEvent() { return m_lEvent; }
187     DWORD GetError() { return m_dwError; }
188     DWORD GetSendTimeout() { return m_dwSendTimeout; }
189     DWORD GetReceiveTimeout() { return m_dwReceiveTimeout; }
190    
191     protected:
192     DECLARE_MESSAGE_MAP()
193     afx_msg LRESULT OnSocketMessage(WPARAM wParam, LPARAM lParam);
194     afx_msg LRESULT OnGetHostMessage(WPARAM wParam, LPARAM lParam);
195    
196     virtual BOOL CreateSocket(SOCKMSG SockMsg) = 0;
197    
198     BOOL CreateSocketWindow();
199     BOOL IsLANConnection(const LPSOCKADDR lpSockAddr);
200     void MakeSockAddrIN(LPSOCKADDR_IN lpSockAddrIN, DWORD dwAddress, WORD wPort, UINT nAF = AF_INET);
201    
202     BOOL doCloseSocket(SOCKET hSocket);
203 sho1get 13 BOOL doGetHostByName(HANDLE hTask, int nErrorCode);
204 sho1get 11 BOOL doSend(SOCKET hSocket, const CByteArray &data);
205     BOOL doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpSockAddr, int nSockAddrLen);
206     BOOL doReceive(SOCKET hSocket, CByteArray &data);
207     BOOL doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpSockAddr, int *lpSockAddrLen);
208     BOOL doSetSendTimeout(SOCKET hSocket, DWORD dwTimeout);
209     BOOL doSetReceiveTimeout(SOCKET hSocket, DWORD dwTimeout);
210     BOOL doSetSendBufferSize(SOCKET hSocket, DWORD dwBufSize);
211     BOOL doSetReceiveBufferSize(SOCKET hSocket, DWORD dwBufSize);
212     BOOL doShutdown(SOCKET hSocket, int nFlag);
213     BOOL doAsyncSelect(SOCKET hSocket, UINT uMsg, LONG lEvent);
214     BOOL doAsyncGetHostByName(UINT uMsg, const LPCSTR szHostName, LPSTR szHostEnt, int nBufLen);
215     BOOL doSetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPCSTR lpOptionValue, int nOptionLen);
216     BOOL doGetSockOpt(SOCKET hSocket, int nLevel, int nOptionName, LPSTR lpOptionValue, int *lpOptionLen);
217     BOOL doSetBlocking(SOCKET hSocket);
218     BOOL doSetKeepAlive(SOCKET hSocket, DWORD dwKaTime, DWORD dwInterval);
219     BOOL doBind(SOCKET hSocket, WORD wPort, DWORD dwAddress);
220     BOOL doGetSockName(SOCKET hSocket, LPSOCKADDR lpSockAddr);
221     BOOL doGetPeerName(SOCKET hSocket, LPSOCKADDR lpSockAddr);
222     BOOL doSetReuseAddr(SOCKET hSocket, BOOL flag);
223     BOOL doIOCtlSocket(SOCKET hSocket, LONG lCommand, DWORD *lpArgument);
224     BOOL doWSAIOCtl(SOCKET hSocket, DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
225     DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
226     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
227    
228     #ifdef _DEBUG
229     CString DwToIPAddress(DWORD dwAddress)
230     {
231     CString cs;
232     dwAddress = htonl(dwAddress);
233     cs.Format(_T("%d.%d.%d.%d"),
234     (dwAddress >> 24) & 0xff,
235     (dwAddress >> 16) & 0xff,
236     (dwAddress >> 8) & 0xff,
237     dwAddress & 0xff);
238     return cs;
239     }
240     #endif
241    
242     protected:
243     typedef struct _HEADER
244     {
245     size_t size;
246 sho1get 13 size_t pad;
247     WORD flags;
248 sho1get 11 }
249     HEADER, *LPHEADER;
250    
251     typedef struct _SOCKETDATA
252     {
253     SOCKET hSocket;
254     NETADDR NetAddr;
255     }
256     SOCKETDATA, *LPSOCKETDATA;
257    
258     typedef struct _HOSTNAME
259     {
260     HANDLE hTask;
261     CHAR buf[MAXGETHOSTSTRUCT];
262     }
263     HOSTNAME, *LPHOSTNAME;
264    
265     protected:
266     LOCALNET m_LocalNet;
267     HOSTNAME m_HostName;
268     SOCKADDR m_PeerAddr;
269     SOCKADDR m_LocalAddr;
270     SOCKMSG m_SockMsg;
271     SOCKET m_hSocket;
272     DWORD m_dwError;
273     DWORD m_dwSendTimeout;
274     DWORD m_dwReceiveTimeout;
275     LONG m_lEvent;
276     WORD m_wBindPort;
277     BOOL m_fBlocking;
278     BOOL m_fWnd;
279     BOOL m_fInit;
280     };
281    
282     //////////////////////////////////////////////////////////////////////////
283    
284     class CServerSocket : public IBaseSocket
285     {
286     DECLARE_DYNAMIC(CServerSocket)
287    
288     public:
289     CServerSocket();
290     virtual ~CServerSocket();
291    
292     virtual void OnAccept(SOCKET hSocket, int nErrorCode);
293     virtual void OnClose(SOCKET hSocket, int nErrorCode);
294     virtual void OnSend(SOCKET hSocket, int nErrorCode);
295     virtual void OnReceive(SOCKET hSocket, int nErrorCode);
296    
297     BOOL Initialize(SOCKMSG SockMsg, WORD wPort, DWORD dwBindAddress = INADDR_ANY, int nBacklog = 5);
298     BOOL Accept(LPSOCKADDR lpSockAddr, int *lpSockAddrLen);
299     BOOL Listen(int nBacklog = 5);
300     BOOL Broadcast(const CByteArray &data);
301     BOOL SendToClient(const CByteArray &data, DWORD dwAddress, WORD wPort);
302    
303     void SetAccept(BOOL fAccept);
304     BOOL GetAccept() { return m_fAccept; }
305     void SetConnectionMode(BOOL fInternet) { m_fInternet = fInternet; }
306     BOOL GetConnectionMode() { return m_fInternet; }
307    
308     protected:
309     virtual BOOL CreateSocket(SOCKMSG SockMsg);
310    
311     int SearchSocketConnection(SOCKET hSocket);
312     void AddConnection(SOCKET hSocket, const LPSOCKADDR lpSockAddr, int nSockAddrLen);
313     void CloseAllSocketConnection();
314     BOOL ServerReceive(SOCKET hSocket);
315     BOOL CloseSocketConnection(SOCKET hSocket, LPNETADDR lpNetAddr);
316     SOCKET GetSocketHandle(DWORD dwAddress, WORD wPort);
317    
318     protected:
319     typedef CArray<SOCKETDATA> SocketDataArray;
320    
321     typedef struct _AtmSDArray
322     {
323     SocketDataArray list;
324     CCriticalSection cs;
325     }
326     AtmSDArray, *LPAtmSDArray;
327    
328     AtmSDArray m_sdList;
329     BOOL m_fAccept;
330     BOOL m_fInternet;
331     };
332    
333     //////////////////////////////////////////////////////////////////////////
334    
335     class CClientSocket : public IBaseSocket
336     {
337     DECLARE_DYNAMIC(CClientSocket)
338    
339     public:
340     CClientSocket();
341     virtual ~CClientSocket();
342    
343     virtual void OnConnect(SOCKET hSocket, int nErrorCode);
344     virtual void OnClose(SOCKET hSocket, int nErrorCode);
345     virtual void OnSend(SOCKET hSocket, int nErrorCode);
346     virtual void OnReceive(SOCKET hSocket, int nErrorCode);
347    
348     BOOL Initialize(SOCKMSG SockMsg);
349     BOOL AsyncConnect(const LPSOCKADDR lpDstAddr, int nLength);
350     BOOL AsyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength);
351     BOOL SyncConnect(const LPSOCKADDR lpDstAddr, int nLength, DWORD dwTimeout);
352     BOOL SyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength, DWORD dwTimeout);
353    
354     protected:
355     virtual BOOL CreateSocket(SOCKMSG SockMsg);
356     };
357    
358     //////////////////////////////////////////////////////////////////////////
359    
360     class CPeerSocket : public IBaseSocket
361     {
362     DECLARE_DYNAMIC(CPeerSocket)
363    
364     public:
365     CPeerSocket();
366     virtual ~CPeerSocket();
367    
368     virtual void OnClose(SOCKET hSocket, int nErrorCode);
369     virtual void OnSend(SOCKET hSocket, int nErrorCode);
370     virtual void OnReceive(SOCKET hSocket, int nErrorCode);
371     virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
372    
373     protected:
374     virtual BOOL CreateSocket(SOCKMSG SockMsg);
375     };
376    
377     //////////////////////////////////////////////////////////////////////////
378    
379     class CBcastSocket : public CPeerSocket
380     {
381     DECLARE_DYNAMIC(CBcastSocket)
382    
383     public:
384     CBcastSocket();
385     virtual ~CBcastSocket();
386    
387     BOOL SetBroadcast(DWORD dwLocalAddress, DWORD dwMaskAddress, WORD wPort);
388     BOOL SetBroadcast(DWORD dwBcastAddress, WORD wPort);
389     BOOL ResetBroadcast();
390     BOOL Broadcast(const CByteArray &data);
391    
392     protected:
393     SOCKADDR m_BcastAddr;
394     BOOL m_fBcast;
395     };
396    
397     //////////////////////////////////////////////////////////////////////////
398    
399     class CMcastSocket : public CPeerSocket
400     {
401     DECLARE_DYNAMIC(CMcastSocket)
402    
403     public:
404     CMcastSocket();
405     virtual ~CMcastSocket();
406    
407     BOOL SetReceiveMulticast(DWORD dwMcastAddress);
408     BOOL JoinMulticastGroup(DWORD dwMcastAddress, WORD wPort);
409     BOOL LeaveMulticastGroup();
410     BOOL SetTTL(DWORD dwTTL);
411     BOOL Multicast(const CByteArray &data);
412    
413     protected:
414     SOCKADDR m_McastAddr;
415     BOOL m_fMcast;
416     };
417    
418     //////////////////////////////////////////////////////////////////////////
419    
420     class CRawSocket : public CPeerSocket
421     {
422     DECLARE_DYNAMIC(CRawSocket)
423    
424     public:
425     CRawSocket();
426     virtual ~CRawSocket();
427    
428     virtual BOOL Initialize(SOCKMSG SockMsg, DWORD dwLocalAddress, WORD wPort);
429    
430     BOOL SetPromiscuous(BOOL flag);
431    
432     protected:
433     virtual BOOL CreateSocket(SOCKMSG SockMsg);
434    
435     protected:
436     BOOL m_fPromiscuous;
437     };
438    
439     //////////////////////////////////////////////////////////////////////////]

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