Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/ClientSocket.cpp

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-c++src
File size: 5325 byte(s)
Update_20100628
1 sho1get 11 #pragma once
2    
3     #include "stdafx.h"
4     #include "SocketX.h"
5    
6     //////////////////////////////////////////////////////////////////////////
7    
8     IMPLEMENT_DYNAMIC(CClientSocket, IBaseSocket)
9    
10     CClientSocket::CClientSocket()
11     {
12     ZeroMemory(&m_PeerAddr, sizeof(m_PeerAddr));
13     }
14    
15     CClientSocket::~CClientSocket()
16     {
17     }
18    
19     void CClientSocket::OnConnect(SOCKET hSocket, int nErrorCode)
20     {
21 sho1get 16 SOCKADDR sAddr;
22 sho1get 11 NETADDR NetAddr;
23    
24     if (nErrorCode != 0)
25     {
26     TRACE1("***** ERROR: OnConnect(%d) *****\n", nErrorCode);
27     return;
28     }
29    
30 sho1get 16 if (!doGetPeerName(hSocket, &sAddr) || !AsyncSelect(FD_CLIENT))
31 sho1get 11 {
32     return;
33     }
34    
35 sho1get 16 CopyMemory(&m_PeerAddr, &sAddr, sizeof(m_PeerAddr));
36 sho1get 11
37 sho1get 16 ConvertSockAddrToNetAddr(&sAddr, NetAddr);
38     m_SockMsg.pCallback->OnSocketConnectMessage(m_SockMsg.dwSocketID, NetAddr);
39 sho1get 11 }
40    
41     void CClientSocket::OnReceive(SOCKET hSocket, int nErrorCode)
42     {
43     CByteArray data;
44 sho1get 16 SOCKADDR sAddr;
45 sho1get 11 NETADDR NetAddr;
46    
47     if (nErrorCode != 0)
48     {
49     TRACE1("***** ERROR: OnReceive(%d) *****\n", nErrorCode);
50     return;
51     }
52    
53 sho1get 16 if (!doGetPeerName(hSocket, &sAddr) || !doReceive(hSocket, data))
54 sho1get 11 {
55     return;
56     }
57    
58 sho1get 16 ConvertSockAddrToNetAddr(&sAddr, NetAddr);
59     m_SockMsg.pCallback->OnSocketReceiveMessage(m_SockMsg.dwSocketID, NetAddr, data);
60 sho1get 11 }
61    
62     void CClientSocket::OnSend(SOCKET hSocket, int nErrorCode)
63     {
64     if (nErrorCode != 0)
65     {
66     TRACE1("***** ERROR: OnSend(%d) *****\n", nErrorCode);
67     return;
68     }
69    
70 sho1get 16 m_SockMsg.pCallback->OnSocketSendMessage(m_SockMsg.dwSocketID);
71 sho1get 11 }
72    
73     void CClientSocket::OnClose(SOCKET hSocket, int nErrorCode)
74     {
75     NETADDR NetAddr;
76    
77     // WinSock Error(10053) Keep-Alive timeout
78     if (nErrorCode != 10053 && nErrorCode != 0)
79     {
80     TRACE1("***** ERROR: OnClose(%d) *****\n", nErrorCode);
81     return;
82     }
83    
84     ConvertSockAddrToNetAddr(&m_PeerAddr, NetAddr);
85 sho1get 16 m_SockMsg.pCallback->OnSocketCloseMessage(m_SockMsg.dwSocketID, NetAddr);
86 sho1get 11 }
87    
88     BOOL CClientSocket::CreateSocket(SOCKMSG SockMsg)
89     {
90 sho1get 16 return doCreateSocket(SockMsg, SOCK_STREAM, IPPROTO_TCP);
91 sho1get 11 }
92    
93     BOOL CClientSocket::Initialize(SOCKMSG SockMsg)
94     {
95     BOOL fSend, fReceive, flag = TRUE;
96    
97     if (!CreateSocket(SockMsg))
98     {
99     return FALSE;
100     }
101    
102     // TCP Option(no delay)
103     if (!SetSockOpt(TCP_NODELAY, (LPSTR)&flag, sizeof(flag)))
104     {
105     CloseSocket();
106     return FALSE;
107     }
108    
109     // buffer size
110     fSend = fReceive = FALSE;
111    
112     for (UINT nBufSize = SX_TCP_MAXBUFSIZE; nBufSize > 0; nBufSize /= 2)
113     {
114     if (!fSend && SetSendBufferSize(nBufSize))
115     {
116     fSend = TRUE;
117     }
118    
119     if (!fReceive && SetReceiveBufferSize(nBufSize))
120     {
121     fReceive = TRUE;
122     }
123    
124     if (fSend && fReceive && TRUE)
125     {
126     break;
127     }
128     }
129    
130     return TRUE;
131     }
132    
133     BOOL CClientSocket::SyncConnect(const LPSOCKADDR lpDstAddr, int nLength, DWORD dwTimeout)
134     {
135     WSANETWORKEVENTS wnEvent;
136     WSAEVENT hEvent;
137     DWORD dwRet, dwOption, dwError;
138     BOOL fRet = FALSE;
139     int nRet;
140    
141     hEvent = WSACreateEvent();
142    
143     if (hEvent == WSA_INVALID_EVENT)
144     {
145     TRACE1("***** ERROR: WSACreateEvent(%d) *****\n", GetLastError());
146     m_dwError = GetLastError();
147     return FALSE;
148     }
149    
150     nRet = WSAEventSelect(m_hSocket, hEvent, FD_CONNECT);
151    
152     if (nRet == SOCKET_ERROR)
153     {
154     TRACE1("***** ERROR: WSAEventSelect(%d) *****\n", GetLastError());
155     m_dwError = GetLastError();
156     WSACloseEvent(hEvent);
157     return FALSE;
158     }
159    
160     nRet = connect(m_hSocket, lpDstAddr, nLength);
161    
162     if (nRet == SOCKET_ERROR)
163     {
164     dwError = GetLastError();
165    
166     if (dwError != WSAEWOULDBLOCK)
167     {
168     TRACE1("***** ERROR: connect(%d) *****\n", GetLastError());
169     m_dwError = dwError;
170     goto END;
171     }
172     }
173    
174     // Wait...
175     dwRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, dwTimeout, FALSE);
176    
177     switch (dwRet)
178     {
179     case WSA_WAIT_TIMEOUT:
180     case WSA_WAIT_FAILED:
181     TRACE1("***** ERROR: WSAWaitForMultipleEvents(%d) *****\n", GetLastError());
182     m_dwError = GetLastError();
183     goto END;
184    
185     default:
186     nRet = WSAEnumNetworkEvents(m_hSocket, hEvent, &wnEvent);
187    
188     if (nRet == SOCKET_ERROR)
189     {
190     TRACE1("***** ERROR: WSAEnumNetworkEvents(%d) *****\n", GetLastError());
191     m_dwError = GetLastError();
192     goto END;
193     }
194    
195     if ((wnEvent.lNetworkEvents & FD_CONNECT) &&
196     (wnEvent.iErrorCode[FD_CONNECT_BIT] == 0))
197     {
198     fRet = TRUE;
199     }
200     }
201    
202     END:
203     WSAEventSelect(m_hSocket, hEvent, 0);
204     WSACloseEvent(hEvent);
205    
206     // Blocking socket
207     dwOption = 0;
208     IOCtlSocket(FIONBIO, &dwOption);
209    
210     return fRet;
211     }
212    
213     BOOL CClientSocket::SyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength, DWORD dwTimeout)
214     {
215 sho1get 16 SOCKADDR_IN sAddrIn;
216     MakeSockAddrIN(&sAddrIn, inet_addr(lpDstAddr), wPort);
217     return SyncConnect((LPSOCKADDR)&sAddrIn, sizeof(sAddrIn), dwTimeout);
218 sho1get 11 }
219    
220     BOOL CClientSocket::AsyncConnect(const LPSOCKADDR lpDstAddr, int nLength)
221     {
222     if (!AsyncSelect(FD_CONNECT))
223     {
224     return FALSE;
225     }
226    
227     if (connect(m_hSocket, lpDstAddr, nLength) == SOCKET_ERROR)
228     {
229     m_dwError = GetLastError();
230    
231     if (m_dwError != WSAEWOULDBLOCK)
232     {
233     TRACE1("***** ERROR: connect(%d) *****\n", GetLastError());
234     return FALSE;
235     }
236     }
237    
238     return TRUE;
239     }
240    
241     BOOL CClientSocket::AsyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength)
242     {
243 sho1get 16 SOCKADDR_IN sAddrIn;
244     MakeSockAddrIN(&sAddrIn, inet_addr(lpDstAddr), wPort);
245     return AsyncConnect((LPSOCKADDR)&sAddrIn, sizeof(sAddrIn));
246 sho1get 11 }
247    
248     //////////////////////////////////////////////////////////////////////////

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