Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/ClientSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (show 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 #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