Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/ServerSocket.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: 8220 byte(s)


1 #pragma once
2
3 #include "stdafx.h"
4 #include "SocketX.h"
5
6 //////////////////////////////////////////////////////////////////////////
7
8 IMPLEMENT_DYNAMIC(CServerSocket, IBaseSocket)
9
10 CServerSocket::CServerSocket() :
11 m_fAccept(TRUE),
12 m_fInternet(TRUE)
13 {
14 }
15
16 CServerSocket::~CServerSocket()
17 {
18 CloseAllSocketConnection();
19 }
20
21 void CServerSocket::OnSend(SOCKET hSocket, int nErrorCode)
22 {
23 if (nErrorCode != 0)
24 {
25 TRACE1("***** ERROR: OnSend(%d) *****\n", nErrorCode);
26 return;
27 }
28
29 m_SockMsg.pTgtObj->OnSocketSendMessage(m_SockMsg.dwSocketID);
30 }
31
32 void CServerSocket::OnReceive(SOCKET hSocket, int nErrorCode)
33 {
34 CByteArray data, buf;
35 SOCKADDR SockAddr;
36 NETADDR NetAddr;
37 int nRet, nIndex;
38
39 if (nErrorCode != 0)
40 {
41 TRACE1("***** ERROR: OnReceive(%d) *****\n", nErrorCode);
42 return;
43 }
44
45 nIndex = SearchSocketConnection(hSocket);
46
47 if (nIndex == -1)
48 {
49 nRet = 0;
50 buf.SetSize(SX_TCP_MINBUFSIZE);
51
52 while (nRet != SOCKET_ERROR)
53 {
54 nRet = recv(hSocket, reinterpret_cast<LPSTR>(&buf[0]), buf.GetSize(), 0);
55 }
56
57 closesocket(hSocket);
58 TRACE0("***** ERROR: Receive(Socket not found) *****\n");
59 return;
60 }
61
62 if (!doGetPeerName(hSocket, &SockAddr) || !doReceive(hSocket, data))
63 {
64 return;
65 }
66
67 ConvertSockAddrToNetAddr(&SockAddr, NetAddr);
68 m_SockMsg.pTgtObj->OnSocketReceiveMessage(m_SockMsg.dwSocketID, NetAddr, data);
69 }
70
71 void CServerSocket::OnAccept(SOCKET hSocket, int nErrorCode)
72 {
73 SOCKADDR SockAddr;
74 NETADDR NetAddr;
75 int nSockLen = sizeof(SOCKADDR);
76
77 if (nErrorCode != 0)
78 {
79 TRACE1("***** ERROR: OnAccept(%d) *****\n", nErrorCode);
80 return;
81 }
82
83 if (!Accept(&SockAddr, &nSockLen))
84 {
85 return;
86 }
87
88 if (!doSetKeepAlive(hSocket, SX_KA_TIME, SX_KA_INTERVAL))
89 {
90 doCloseSocket(hSocket);
91 return;
92 }
93
94 ConvertSockAddrToNetAddr(&SockAddr, NetAddr);
95 m_SockMsg.pTgtObj->OnSocketAcceptMessage(m_SockMsg.dwSocketID, NetAddr);
96 }
97
98 void CServerSocket::OnClose(SOCKET hSocket, int nErrorCode)
99 {
100 NETADDR NetAddr;
101
102 // WinSock Error(10053) Keep-Alive timeout
103 if (nErrorCode != 10053 && nErrorCode != 0)
104 {
105 TRACE1("***** ERROR: OnClose(%d) *****\n", nErrorCode);
106 return;
107 }
108
109 if (!CloseSocketConnection(hSocket, &NetAddr))
110 {
111 TRACE("***** ERROR: OnClose(Socket not found) *****\n");
112 return;
113 }
114
115 m_SockMsg.pTgtObj->OnSocketCloseMessage(m_SockMsg.dwSocketID, NetAddr);
116 }
117
118 BOOL CServerSocket::CreateSocket(SOCKMSG SockMsg)
119 {
120 if (!IBaseSocket::CreateSocketWindow())
121 {
122 return FALSE;
123 }
124
125 SetTargetWnd(SockMsg);
126
127 m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
128
129 if (m_hSocket == INVALID_SOCKET)
130 {
131 TRACE1("***** ERROR: socket(%d) *****\n", GetLastError());
132 m_dwError = GetLastError();
133 return FALSE;
134 }
135
136 if (!AsyncSelect(FD_SERVER))
137 {
138 return FALSE;
139 }
140
141 SetSendTimeout(m_dwSendTimeout);
142 SetRecieveTimeout(m_dwReceiveTimeout);
143
144 return TRUE;
145 }
146
147 BOOL CServerSocket::Initialize(SOCKMSG SockMsg, WORD wPort, DWORD dwBindAddress, int nBacklog)
148 {
149 BOOL flag = TRUE;
150 BOOL fSend, fReceive;
151
152 if (!CreateSocket(SockMsg))
153 {
154 return FALSE;
155 }
156
157 if (!(Bind(wPort, dwBindAddress) && SetReuseAddr(TRUE) && Listen(nBacklog)))
158 {
159 CloseSocket();
160 return FALSE;
161 }
162
163 // TCP Option(no delay)
164 if (!SetSockOpt(TCP_NODELAY, (LPSTR)&flag, sizeof(flag)))
165 {
166 CloseSocket();
167 return FALSE;
168 }
169
170 // buffer size
171 fSend = fReceive = FALSE;
172
173 for (UINT nBufSize = SX_TCP_MAXBUFSIZE; nBufSize > 0; nBufSize /= 2)
174 {
175 if (!fSend && SetSendBufferSize(nBufSize))
176 {
177 fSend = TRUE;
178 }
179
180 if (!fReceive && SetReceiveBufferSize(nBufSize))
181 {
182 fReceive = TRUE;
183 }
184
185 if (fSend && fReceive && TRUE)
186 {
187 break;
188 }
189 }
190
191 m_fInit = TRUE;
192
193 return TRUE;
194 }
195
196 BOOL CServerSocket::Listen(int nBacklog)
197 {
198 if (listen(m_hSocket, nBacklog) == SOCKET_ERROR)
199 {
200 TRACE1("***** ERROR: listen(%d) *****\n", GetLastError());
201 m_dwError = GetLastError();
202 return FALSE;
203 }
204
205 return TRUE;
206 }
207
208 BOOL CServerSocket::Accept(LPSOCKADDR lpSockAddr, int *lpSockAddrLen)
209 {
210 SOCKET hSocket;
211 BOOL flag = TRUE;
212 BOOL fSend, fReceive;
213
214 hSocket = accept(m_hSocket, lpSockAddr, lpSockAddrLen);
215
216 if (hSocket == INVALID_SOCKET)
217 {
218 TRACE1("***** ERROR: accept(%d) *****\n", GetLastError());
219 m_dwError = GetLastError();
220 return FALSE;
221 }
222
223 if (!m_fInternet && !IsLANConnection(lpSockAddr))
224 {
225 doCloseSocket(hSocket);
226 return FALSE;
227 }
228
229 // TCP Option(no delay)
230 if (!doSetSockOpt(hSocket, SOL_SOCKET, TCP_NODELAY, (LPSTR)&flag, sizeof(flag)))
231 {
232 m_dwError = GetLastError();
233 doCloseSocket(hSocket);
234 return FALSE;
235 }
236
237 // buffer size
238 fSend = fReceive = FALSE;
239
240 for (UINT nBufSize = SX_TCP_MAXBUFSIZE; nBufSize > 0; nBufSize /= 2)
241 {
242 if (!fSend && doSetSendBufferSize(hSocket, nBufSize))
243 {
244 fSend = TRUE;
245 }
246
247 if (!fReceive && doSetReceiveBufferSize(hSocket, nBufSize))
248 {
249 fReceive = TRUE;
250 }
251
252 if (fSend && fReceive && TRUE)
253 {
254 break;
255 }
256 }
257
258 if (!doAsyncSelect(hSocket, SM_EVENT, FD_CLIENT))
259 {
260 m_dwError = GetLastError();
261 doCloseSocket(hSocket);
262 return FALSE;
263 }
264
265 AddConnection(hSocket, lpSockAddr, *lpSockAddrLen);
266
267 return TRUE;
268 }
269
270 void CServerSocket::AddConnection(SOCKET hSocket, const LPSOCKADDR lpSockAddr, int nSockAddrLen)
271 {
272 SOCKETDATA sd;
273 ZeroMemory(&sd, sizeof(sd));
274 sd.hSocket = hSocket;
275 ConvertSockAddrToNetAddr(lpSockAddr, sd.NetAddr);
276 CSingleLock cl(&m_sdList.cs, TRUE);
277 m_sdList.list.Add(sd);
278 }
279
280 BOOL CServerSocket::CloseSocketConnection(SOCKET hSocket, LPNETADDR lpNetAddr)
281 {
282 int nIndex = SearchSocketConnection(hSocket);
283
284 if (nIndex != -1)
285 {
286 CSingleLock sl(&m_sdList.cs, TRUE);
287 doCloseSocket(m_sdList.list[nIndex].hSocket);
288 *lpNetAddr = m_sdList.list[nIndex].NetAddr;
289 m_sdList.list.RemoveAt(nIndex);
290 return TRUE;
291 }
292
293 TRACE0("***** ERROR: CloseSocketConnection(Socket not found) *****\n");
294
295 return FALSE;
296 }
297
298 void CServerSocket::CloseAllSocketConnection()
299 {
300 UINT nSize;
301
302 CSingleLock sl(&m_sdList.cs, TRUE);
303 nSize = m_sdList.list.GetSize();
304
305 for (UINT i = 0; i < nSize; i++)
306 {
307 doShutdown(m_sdList.list[i].hSocket, SD_BOTH);
308 doCloseSocket(m_sdList.list[i].hSocket);
309 }
310
311 m_sdList.list.RemoveAll();
312 }
313
314 int CServerSocket::SearchSocketConnection(SOCKET hSocket)
315 {
316 CSingleLock sl(&m_sdList.cs, TRUE);
317 UINT nSize = m_sdList.list.GetSize();
318 int nRet = -1;
319
320 for (UINT i = 0; i < nSize; i++)
321 {
322 if (m_sdList.list[i].hSocket == hSocket)
323 {
324 nRet = i; break;
325 }
326 }
327
328 return nRet;
329 }
330
331 BOOL CServerSocket::Broadcast(const CByteArray &data)
332 {
333 CSingleLock sl(&m_sdList.cs, TRUE);
334
335 BOOL fRet;
336 BOOL fResult = TRUE;
337 UINT nDataSize = data.GetSize();
338 UINT nListSize = static_cast<UINT>(m_sdList.list.GetSize());
339
340 if (nListSize < 1)
341 {
342 return FALSE;
343 }
344
345 for (UINT i = 0; i < nListSize; i++)
346 {
347 fRet = doSend(m_sdList.list[i].hSocket, data);
348
349 if (!fRet)
350 {
351 fResult = FALSE;
352 TRACE1("***** ERROR: Broadcast(Dst: %s) *****\n",
353 DwToIPAddress(m_sdList.list[i].NetAddr.dwAddress));
354 }
355 }
356
357 return fResult;
358 }
359
360 SOCKET CServerSocket::GetSocketHandle(DWORD dwAddress, WORD wPort)
361 {
362 CSingleLock sl(&m_sdList.cs, TRUE);
363 SOCKET hSocket = INVALID_SOCKET;
364 UINT nListSize = static_cast<UINT>(m_sdList.list.GetSize());
365
366 for (UINT i = 0; i < nListSize; i++)
367 {
368 if ((m_sdList.list[i].NetAddr.dwAddress == dwAddress) &&
369 (m_sdList.list[i].NetAddr.wPort == wPort))
370 {
371 hSocket = m_sdList.list[i].hSocket;
372 break;
373 }
374 }
375
376 return hSocket;
377 }
378
379 BOOL CServerSocket::SendToClient(const CByteArray &data, DWORD dwAddress, WORD wPort)
380 {
381 SOCKET hSocket = GetSocketHandle(dwAddress, wPort);
382
383 if (hSocket == INVALID_SOCKET)
384 {
385 TRACE0("***** ERROR: SendToClient(Socket not found) *****\n");
386 return FALSE;
387 }
388
389 return doSend(hSocket, data);
390 }
391
392 void CServerSocket::SetAccept(BOOL fAccept)
393 {
394 if (m_fAccept != fAccept)
395 {
396 m_fAccept = fAccept;
397 m_lEvent = m_fAccept ? (m_lEvent | FD_ACCEPT) : (m_lEvent ^ FD_ACCEPT);
398 AsyncSelect(m_lEvent);
399 }
400 }
401
402 //////////////////////////////////////////////////////////////////////////

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