Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/ClientSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations) (download) (as text)
Wed Feb 10 18:21:00 2010 UTC (14 years, 2 months ago) by sho1get
File MIME type: text/x-c++src
File size: 5673 byte(s)


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     SOCKADDR SockAddr;
22     NETADDR NetAddr;
23    
24     if (nErrorCode != 0)
25     {
26     TRACE1("***** ERROR: OnConnect(%d) *****\n", nErrorCode);
27     return;
28     }
29    
30     if (!doGetPeerName(hSocket, &SockAddr) || !AsyncSelect(FD_CLIENT))
31     {
32     return;
33     }
34    
35     CopyMemory(&m_PeerAddr, &SockAddr, sizeof(m_PeerAddr));
36    
37     ConvertSockAddrToNetAddr(&SockAddr, NetAddr);
38     m_SockMsg.pTgtObj->OnSocketConnectMessage(m_SockMsg.dwSocketID, NetAddr);
39     }
40    
41     void CClientSocket::OnReceive(SOCKET hSocket, int nErrorCode)
42     {
43     CByteArray data;
44     SOCKADDR SockAddr;
45     NETADDR NetAddr;
46    
47     if (nErrorCode != 0)
48     {
49     TRACE1("***** ERROR: OnReceive(%d) *****\n", nErrorCode);
50     return;
51     }
52    
53     if (!doGetPeerName(hSocket, &SockAddr) || !doReceive(hSocket, data))
54     {
55     return;
56     }
57    
58     ConvertSockAddrToNetAddr(&SockAddr, NetAddr);
59     m_SockMsg.pTgtObj->OnSocketReceiveMessage(m_SockMsg.dwSocketID, NetAddr, data);
60     }
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     m_SockMsg.pTgtObj->OnSocketSendMessage(m_SockMsg.dwSocketID);
71     }
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     m_SockMsg.pTgtObj->OnSocketCloseMessage(m_SockMsg.dwSocketID, NetAddr);
86     }
87    
88     BOOL CClientSocket::CreateSocket(SOCKMSG SockMsg)
89     {
90     if (!IBaseSocket::CreateSocketWindow())
91     {
92     return FALSE;
93     }
94    
95     SetTargetWnd(SockMsg);
96    
97     m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
98    
99     if (m_hSocket == INVALID_SOCKET)
100     {
101     TRACE1("***** ERROR: socket(%d) *****\n", GetLastError());
102     m_dwError = GetLastError();
103     return FALSE;
104     }
105    
106     SetSendTimeout(m_dwSendTimeout);
107     SetRecieveTimeout(m_dwReceiveTimeout);
108    
109     return TRUE;
110     }
111    
112     BOOL CClientSocket::Initialize(SOCKMSG SockMsg)
113     {
114     BOOL fSend, fReceive, flag = TRUE;
115    
116     if (!CreateSocket(SockMsg))
117     {
118     return FALSE;
119     }
120    
121     // TCP Option(no delay)
122     if (!SetSockOpt(TCP_NODELAY, (LPSTR)&flag, sizeof(flag)))
123     {
124     CloseSocket();
125     return FALSE;
126     }
127    
128     // buffer size
129     fSend = fReceive = FALSE;
130    
131     for (UINT nBufSize = SX_TCP_MAXBUFSIZE; nBufSize > 0; nBufSize /= 2)
132     {
133     if (!fSend && SetSendBufferSize(nBufSize))
134     {
135     fSend = TRUE;
136     }
137    
138     if (!fReceive && SetReceiveBufferSize(nBufSize))
139     {
140     fReceive = TRUE;
141     }
142    
143     if (fSend && fReceive && TRUE)
144     {
145     break;
146     }
147     }
148    
149     return TRUE;
150     }
151    
152     BOOL CClientSocket::SyncConnect(const LPSOCKADDR lpDstAddr, int nLength, DWORD dwTimeout)
153     {
154     WSANETWORKEVENTS wnEvent;
155     WSAEVENT hEvent;
156     DWORD dwRet, dwOption, dwError;
157     BOOL fRet = FALSE;
158     int nRet;
159    
160     hEvent = WSACreateEvent();
161    
162     if (hEvent == WSA_INVALID_EVENT)
163     {
164     TRACE1("***** ERROR: WSACreateEvent(%d) *****\n", GetLastError());
165     m_dwError = GetLastError();
166     return FALSE;
167     }
168    
169     nRet = WSAEventSelect(m_hSocket, hEvent, FD_CONNECT);
170    
171     if (nRet == SOCKET_ERROR)
172     {
173     TRACE1("***** ERROR: WSAEventSelect(%d) *****\n", GetLastError());
174     m_dwError = GetLastError();
175     WSACloseEvent(hEvent);
176     return FALSE;
177     }
178    
179     nRet = connect(m_hSocket, lpDstAddr, nLength);
180    
181     if (nRet == SOCKET_ERROR)
182     {
183     dwError = GetLastError();
184    
185     if (dwError != WSAEWOULDBLOCK)
186     {
187     TRACE1("***** ERROR: connect(%d) *****\n", GetLastError());
188     m_dwError = dwError;
189     goto END;
190     }
191     }
192    
193     // Wait...
194     dwRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, dwTimeout, FALSE);
195    
196     switch (dwRet)
197     {
198     case WSA_WAIT_TIMEOUT:
199     case WSA_WAIT_FAILED:
200     TRACE1("***** ERROR: WSAWaitForMultipleEvents(%d) *****\n", GetLastError());
201     m_dwError = GetLastError();
202     goto END;
203    
204     default:
205     nRet = WSAEnumNetworkEvents(m_hSocket, hEvent, &wnEvent);
206    
207     if (nRet == SOCKET_ERROR)
208     {
209     TRACE1("***** ERROR: WSAEnumNetworkEvents(%d) *****\n", GetLastError());
210     m_dwError = GetLastError();
211     goto END;
212     }
213    
214     if ((wnEvent.lNetworkEvents & FD_CONNECT) &&
215     (wnEvent.iErrorCode[FD_CONNECT_BIT] == 0))
216     {
217     fRet = TRUE;
218     }
219     }
220    
221     END:
222     WSAEventSelect(m_hSocket, hEvent, 0);
223     WSACloseEvent(hEvent);
224    
225     // Blocking socket
226     dwOption = 0;
227     IOCtlSocket(FIONBIO, &dwOption);
228    
229     return fRet;
230     }
231    
232     BOOL CClientSocket::SyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength, DWORD dwTimeout)
233     {
234     SOCKADDR_IN siAddr;
235     MakeSockAddrIN(&siAddr, inet_addr(lpDstAddr), wPort);
236     return SyncConnect((LPSOCKADDR)&siAddr, sizeof(siAddr), dwTimeout);
237     }
238    
239     BOOL CClientSocket::AsyncConnect(const LPSOCKADDR lpDstAddr, int nLength)
240     {
241     if (!AsyncSelect(FD_CONNECT))
242     {
243     return FALSE;
244     }
245    
246     if (connect(m_hSocket, lpDstAddr, nLength) == SOCKET_ERROR)
247     {
248     m_dwError = GetLastError();
249    
250     if (m_dwError != WSAEWOULDBLOCK)
251     {
252     TRACE1("***** ERROR: connect(%d) *****\n", GetLastError());
253     return FALSE;
254     }
255     }
256    
257     return TRUE;
258     }
259    
260     BOOL CClientSocket::AsyncConnect(const LPCSTR lpDstAddr, WORD wPort, int nLength)
261     {
262     SOCKADDR_IN siAddr;
263     MakeSockAddrIN(&siAddr, inet_addr(lpDstAddr), wPort);
264     return AsyncConnect((LPSOCKADDR)&siAddr, sizeof(siAddr));
265     }
266    
267     //////////////////////////////////////////////////////////////////////////

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