Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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


1 #include "stdafx.h"
2 #include "SocketX.h"
3
4 //////////////////////////////////////////////////////////////////////////
5
6 void SocketXFinalize()
7 {
8 WSACleanup();
9 }
10
11 BOOL SocketXInitialize()
12 {
13 WSADATA wsaData;
14 WORD wVersion = MAKEWORD(2, 2);
15
16 if (WSAStartup(wVersion, &wsaData) != 0)
17 {
18 TRACE0("Failed to WSAStartup.\n");
19 return FALSE;
20 }
21
22 if (wVersion != wsaData.wVersion)
23 {
24 TRACE0("Failed to WinhSocket version.\n");
25 return FALSE;
26 }
27
28 atexit(SocketXFinalize);
29
30 return TRUE;
31 }
32
33 //////////////////////////////////////////////////////////////////////////
34
35 IMPLEMENT_DYNAMIC(IBaseSocket, CWnd)
36
37 BEGIN_MESSAGE_MAP(IBaseSocket, CWnd)
38 ON_MESSAGE(SM_EVENT, &IBaseSocket::OnSocketMessage)
39 ON_MESSAGE(SM_GETHOST, &IBaseSocket::OnGetHostMessage)
40 END_MESSAGE_MAP()
41
42 IBaseSocket::IBaseSocket() :
43 m_hSocket(INVALID_SOCKET),
44 m_dwError(0),
45 m_dwSendTimeout(SX_SEND_TIMEOUT),
46 m_dwReceiveTimeout(SX_RECV_TIMEOUT),
47 m_lEvent(0),
48 m_wBindPort(0),
49 m_fBlocking(TRUE),
50 m_fWnd(FALSE),
51 m_fInit(FALSE)
52 {
53 ZeroMemory(&m_SockMsg, sizeof(m_SockMsg));
54 ZeroMemory(&m_HostName.buf, sizeof(m_HostName.buf));
55 ZeroMemory(&m_LocalNet, sizeof(m_LocalNet));
56 ZeroMemory(&m_LocalAddr, sizeof(m_LocalAddr));
57 ZeroMemory(&m_PeerAddr, sizeof(m_PeerAddr));
58 }
59
60 IBaseSocket::~IBaseSocket()
61 {
62 doCloseSocket(m_hSocket);
63
64 if (m_fWnd)
65 {
66 DestroyWindow();
67 }
68 }
69
70 LRESULT IBaseSocket::OnSocketMessage(WPARAM wParam, LPARAM lParam)
71 {
72 SOCKET hSocket = (SOCKET)wParam;
73 int nEventCode = WSAGETSELECTEVENT(lParam);
74 int nErrorCode = WSAGETSELECTERROR(lParam);
75
76 switch (nEventCode)
77 {
78 case FD_CONNECT:
79 OnConnect(hSocket, nErrorCode);
80 break;
81
82 case FD_ACCEPT:
83 OnAccept(hSocket, nErrorCode);
84 break;
85
86 case FD_WRITE:
87 OnSend(hSocket, nErrorCode);
88 break;
89
90 case FD_READ:
91 OnReceive(hSocket, nErrorCode);
92 break;
93
94 case FD_CLOSE:
95 OnClose(hSocket, nErrorCode);
96 break;
97 }
98
99 return 0;
100 }
101
102 LRESULT IBaseSocket::OnGetHostMessage(WPARAM wParam, LPARAM lParam)
103 {
104 int nErrorCode = WSAGETSELECTERROR(lParam);
105 HANDLE hTask = (HANDLE)wParam;
106
107 doGetHostByName(hTask, nErrorCode);
108
109 return 0;
110 }
111
112 BOOL IBaseSocket::CreateSocketWindow()
113 {
114 CString strClass;
115 CRect rect;
116
117 if (m_fWnd)
118 {
119 // Window has already been created.
120 DestroyWindow();
121 m_fWnd = FALSE;
122 }
123
124 try
125 {
126 strClass = AfxRegisterWndClass(0);
127 }
128 catch (CResourceException *e)
129 {
130 TRACE0("***** ERROR: AfxRegisterWndClass *****\n");
131 m_dwError = GetLastError();
132 e->Delete();
133 return FALSE;
134 }
135
136 if (!strClass.IsEmpty())
137 {
138 rect.SetRect(0, 0, 100, 100);
139
140 if (CreateEx(0, strClass, NULL, WS_OVERLAPPEDWINDOW, rect, NULL, 0))
141 {
142 m_fWnd = TRUE;
143 return TRUE;
144 }
145 else
146 {
147 TRACE0("***** ERROR: CreateEx *****\n");
148 m_dwError = GetLastError();
149 return FALSE;
150 }
151 }
152
153 TRACE0("***** ERROR: CreateSocketWindow *****\n");
154
155 return FALSE;
156 }
157
158 BOOL IBaseSocket::CloseSocket()
159 {
160 m_fInit = !doCloseSocket(m_hSocket);
161 return m_fInit;
162 }
163
164 BOOL IBaseSocket::IsLANConnection(const LPSOCKADDR lpSockAddr)
165 {
166 SOCKADDR_IN siAddr;
167 CopyMemory(&siAddr, lpSockAddr, sizeof(siAddr));
168 return (m_LocalNet.dwNet == (m_LocalNet.dwMask & siAddr.sin_addr.s_addr));
169 }
170
171 void IBaseSocket::MakeSockAddrIN(LPSOCKADDR_IN lpSockAddrIN, DWORD dwAddress,
172 WORD wPort, UINT nAF)
173 {
174 ZeroMemory(lpSockAddrIN, sizeof(LPSOCKADDR_IN));
175 lpSockAddrIN->sin_port = htons(wPort);
176 lpSockAddrIN->sin_family = nAF;
177 lpSockAddrIN->sin_addr.s_addr = dwAddress;
178 }
179
180 void IBaseSocket::ConvertSockAddrToNetAddr(const LPSOCKADDR lpSockAddr, NETADDR &NetAddr)
181 {
182 SOCKADDR_IN siAddr;
183 CopyMemory(&siAddr, lpSockAddr, sizeof(siAddr));
184 NetAddr.wPort = ntohs(siAddr.sin_port);
185 NetAddr.nAF = siAddr.sin_family;
186 NetAddr.dwAddress = siAddr.sin_addr.s_addr;
187 }
188
189 BOOL IBaseSocket::Shutdown(int nFlag)
190 {
191 return doShutdown(m_hSocket, nFlag);
192 }
193
194 BOOL IBaseSocket::AsyncSelect(LONG lEvent)
195 {
196 if (doAsyncSelect(m_hSocket, SM_EVENT, lEvent))
197 {
198 m_lEvent = lEvent;
199 m_fBlocking = FALSE;
200 return TRUE;
201 }
202
203 return FALSE;
204 }
205
206 BOOL IBaseSocket::AsyncGetHostByName(const LPCSTR szHostName)
207 {
208 return doAsyncGetHostByName(SM_GETHOST, szHostName, m_HostName.buf, sizeof(m_HostName.buf));
209 }
210
211 BOOL IBaseSocket::SetBlocking()
212 {
213 BOOL fRet = TRUE;
214
215 if (m_fBlocking)
216 {
217 fRet = doSetBlocking(m_hSocket);
218
219 if (fRet)
220 {
221 m_fBlocking = TRUE;
222 m_lEvent = 0;
223 }
224 }
225
226 return FALSE;
227 }
228
229 BOOL IBaseSocket::Bind(WORD wPort, DWORD dwAddress)
230 {
231 return doBind(m_hSocket, wPort, dwAddress);
232 }
233
234 BOOL IBaseSocket::GetSockName(LPSOCKADDR lpSockAddr)
235 {
236 return doGetSockName(m_hSocket, lpSockAddr);
237 }
238
239 BOOL IBaseSocket::GetPeerName(LPSOCKADDR lpSockAddr)
240 {
241 return doGetPeerName(m_hSocket, lpSockAddr);
242 }
243
244 BOOL IBaseSocket::SetSockOpt(int nOptionName, LPCSTR lpOptionValue,
245 int nOptionLen, int nLevel)
246 {
247 return doSetSockOpt(m_hSocket, nLevel, nOptionName, lpOptionValue, nOptionLen);
248 }
249
250 BOOL IBaseSocket::GetSockOpt(int nOptionName, LPSTR lpOptionValue,
251 int *lpOptionLen, int nLevel)
252 {
253 return doGetSockOpt(m_hSocket, nLevel, nOptionName, lpOptionValue, lpOptionLen);
254 }
255
256 BOOL IBaseSocket::SetSendTimeout(DWORD dwTimeout)
257 {
258 return doSetSendTimeout(m_hSocket, dwTimeout);
259 }
260
261 BOOL IBaseSocket::SetRecieveTimeout(DWORD dwTimeout)
262 {
263 return doSetReceiveTimeout(m_hSocket, dwTimeout);
264 }
265
266 BOOL IBaseSocket::SetSendBufferSize(DWORD dwBufSize)
267 {
268 return doSetSendBufferSize(m_hSocket, dwBufSize);
269 }
270
271 BOOL IBaseSocket::SetReceiveBufferSize(DWORD dwBufSize)
272 {
273 return doSetReceiveBufferSize(m_hSocket, dwBufSize);
274 }
275
276 BOOL IBaseSocket::SetKeepAlive(DWORD dwTime, DWORD dwInterval)
277 {
278 return doSetKeepAlive(m_hSocket, dwTime, dwInterval);
279 }
280
281 BOOL IBaseSocket::SetReuseAddr(BOOL flag)
282 {
283 return doSetReuseAddr(m_hSocket, flag);
284 }
285
286 BOOL IBaseSocket::IOCtlSocket(LONG lCommand, DWORD *lpArgument)
287 {
288 return doIOCtlSocket(m_hSocket, lCommand, lpArgument);
289 }
290
291 BOOL IBaseSocket::WSAIOCtl(DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf,
292 LPVOID lpOutBuf, DWORD dwOutBuf, LPDWORD dwByteReturned,
293 LPWSAOVERLAPPED lpOverlapped,
294 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
295 {
296 return doWSAIOCtl(m_hSocket, dwIoCtlCode, lpInBuf, dwInBuf, lpOutBuf, dwOutBuf,
297 dwByteReturned, lpOverlapped, lpCompletionRoutine);
298 }
299
300 void IBaseSocket::GetLocalAddress(NETADDR &NetAddr)
301 {
302 ConvertSockAddrToNetAddr(&m_LocalAddr, NetAddr);
303 }
304
305 void IBaseSocket::GetPeerAddress(NETADDR &NetAddr)
306 {
307 ConvertSockAddrToNetAddr(&m_PeerAddr, NetAddr);
308 }
309
310 BOOL IBaseSocket::Send(const CByteArray &data)
311 {
312 return doSend(m_hSocket, data);
313 }
314
315 BOOL IBaseSocket::Receive(CByteArray &data)
316 {
317 return doReceive(m_hSocket, data);
318 }
319
320 BOOL IBaseSocket::SendTo(const CByteArray &data, const LPSOCKADDR lpSockAddr, int nSockAddrLen)
321 {
322 return doSendTo(m_hSocket, data, lpSockAddr, nSockAddrLen);
323 }
324
325 BOOL IBaseSocket::ReceiveFrom(CByteArray &data, LPSOCKADDR lpSockAddr, int *lpSockAddrLen)
326 {
327 return doReceiveFrom(m_hSocket, data, lpSockAddr, lpSockAddrLen);
328 }
329
330 //////////////////////////////////////////////////////////////////////////
331
332 BOOL IBaseSocket::doGetHostByName(HANDLE hTask, int nErrorCode)
333 {
334 LPHOSTENT lpHostEnt = reinterpret_cast<LPHOSTENT>(m_HostName.buf);
335
336 if (m_HostName.hTask != hTask)
337 {
338 TRACE0("***** ERROR: GetHostByName(Handle) *****\n");
339 return FALSE;
340 }
341
342 m_SockMsg.pTgtObj->OnGetHostByNameMessage(lpHostEnt);
343
344 return TRUE;
345 }
346
347 BOOL IBaseSocket::doCloseSocket(SOCKET hSocket)
348 {
349 if (closesocket(hSocket) != 0)
350 {
351 TRACE1("***** ERROR: closesocket(%d) *****\n", GetLastError());
352 m_dwError = GetLastError();
353 return FALSE;
354 }
355
356 hSocket = INVALID_SOCKET;
357 m_lEvent = 0;
358
359 return TRUE;
360 }
361
362 BOOL IBaseSocket::doShutdown(SOCKET hSocket, int nFlag)
363 {
364 if (shutdown(hSocket, nFlag) == SOCKET_ERROR)
365 {
366 TRACE1("***** ERROR: shutdown(%d) *****\n", GetLastError());
367 m_dwError = GetLastError();
368 return FALSE;
369 }
370
371 return TRUE;
372 }
373
374 BOOL IBaseSocket::doAsyncSelect(SOCKET hSocket, UINT uMsg, LONG lEvent)
375 {
376 if (WSAAsyncSelect(hSocket, m_hWnd, SM_EVENT, lEvent) != 0)
377 {
378 TRACE1("***** ERROR: WSAAsyncSelect(%d) *****\n", GetLastError());
379 m_dwError = GetLastError();
380 return FALSE;
381 }
382
383 return TRUE;
384 }
385
386 BOOL IBaseSocket::doAsyncGetHostByName(UINT uMsg, const LPCSTR szHostName, LPSTR szHostEnt, int nBufLen)
387 {
388 ZeroMemory(szHostEnt, nBufLen);
389
390 m_HostName.hTask = WSAAsyncGetHostByName(m_hWnd, uMsg, szHostName, szHostEnt, nBufLen);
391
392 if (m_HostName.hTask != 0)
393 {
394 TRACE1("***** ERROR: WSAAsyncGetHostByName(%d) *****\n", GetLastError());
395 m_dwError = GetLastError();
396 return FALSE;
397 }
398
399 return TRUE;
400 }
401
402 BOOL IBaseSocket::doSetBlocking(SOCKET hSocket)
403 {
404 DWORD dwVal = 0;
405 return (doAsyncSelect(hSocket, 0, 0) & doIOCtlSocket(hSocket, FIONBIO, &dwVal));
406 }
407
408 BOOL IBaseSocket::doBind(SOCKET hSocket, WORD wPort, DWORD dwAddress)
409 {
410 SOCKADDR_IN siAddr;
411
412 MakeSockAddrIN(&siAddr, dwAddress, wPort);
413
414 if (bind(hSocket, (LPSOCKADDR)&siAddr, sizeof(siAddr)) == SOCKET_ERROR)
415 {
416 TRACE1("***** ERROR: bind(%d) *****\n", GetLastError());
417 m_dwError = GetLastError();
418 return FALSE;
419 }
420
421 m_wBindPort = wPort;
422
423 return TRUE;
424 }
425
426 BOOL IBaseSocket::doGetSockName(SOCKET hSocket, LPSOCKADDR lpSockAddr)
427 {
428 int nLenSA = sizeof(SOCKADDR);
429
430 if (getsockname(hSocket, lpSockAddr, &nLenSA) != 0)
431 {
432 TRACE1("***** ERROR: getsockname(%d) *****\n", GetLastError());
433 m_dwError = GetLastError();
434 return FALSE;
435 }
436
437 return TRUE;
438 }
439
440 BOOL IBaseSocket::doGetPeerName(SOCKET hSocket, LPSOCKADDR lpSockAddr)
441 {
442 int nLenSA = sizeof(SOCKADDR);
443
444 if (getpeername(hSocket, lpSockAddr, &nLenSA) != 0)
445 {
446 TRACE1("***** ERROR: getpeername(%d) *****\n", GetLastError());
447 m_dwError = GetLastError();
448 return FALSE;
449 }
450
451 return TRUE;
452 }
453
454 BOOL IBaseSocket::doSetSockOpt(SOCKET hSocket, int nLevel, int nOptionName,
455 LPCSTR lpOptionValue, int nOptionLen)
456 {
457 if (setsockopt(hSocket, nLevel, nOptionName, lpOptionValue, nOptionLen) == SOCKET_ERROR)
458 {
459 TRACE2("***** ERROR: setsockopt(%d) option(%d) *****\n", GetLastError(), nOptionName);
460 m_dwError = GetLastError();
461 return FALSE;
462 }
463
464 return TRUE;
465 }
466
467 BOOL IBaseSocket::doGetSockOpt(SOCKET hSocket, int nLevel, int nOptionName,
468 LPSTR lpOptionValue, int *lpOptionLen)
469 {
470 if (getsockopt(hSocket, nLevel, nOptionName, lpOptionValue, lpOptionLen) == SOCKET_ERROR)
471 {
472 TRACE2("***** ERROR: getsockopt(%d) option(%d) *****\n", GetLastError(), nOptionName);
473 m_dwError = GetLastError();
474 return FALSE;
475 }
476
477 return TRUE;
478 }
479
480 BOOL IBaseSocket::doSetSendTimeout(SOCKET hSocket, DWORD dwTimeout)
481 {
482 return doSetSockOpt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (LPSTR)&dwTimeout, sizeof(dwTimeout));
483 }
484
485 BOOL IBaseSocket::doSetReceiveTimeout(SOCKET hSocket, DWORD dwTimeout)
486 {
487 return doSetSockOpt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (LPSTR)&dwTimeout, sizeof(dwTimeout));
488 }
489
490 BOOL IBaseSocket::doSetSendBufferSize(SOCKET hSocket, DWORD dwBufSize)
491 {
492 return doSetSockOpt(hSocket, SOL_SOCKET, SO_SNDBUF, (LPSTR)&dwBufSize, sizeof(dwBufSize));
493 }
494
495 BOOL IBaseSocket::doSetReceiveBufferSize(SOCKET hSocket, DWORD dwBufSize)
496 {
497 return doSetSockOpt(hSocket, SOL_SOCKET, SO_RCVBUF, (LPSTR)&dwBufSize, sizeof(dwBufSize));
498 }
499
500 BOOL IBaseSocket::doSetReuseAddr(SOCKET hSocket, BOOL flag)
501 {
502 return doSetSockOpt(hSocket, SOL_SOCKET, SO_REUSEADDR, (LPSTR)&flag, sizeof(flag));
503 }
504
505 BOOL IBaseSocket::doSetKeepAlive(SOCKET hSocket, DWORD dwKaTime, DWORD dwInterval)
506 {
507 struct tcp_keepalive tkaSet, tkaRet;
508 DWORD dwBytes;
509 BOOL flag = TRUE;
510
511 if (!doSetSockOpt(hSocket, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&flag, sizeof(flag)))
512 {
513 return FALSE;
514 }
515
516 ZeroMemory(&tkaSet, sizeof(tkaSet));
517 ZeroMemory(&tkaRet, sizeof(tkaRet));
518 tkaSet.onoff = 1;
519 tkaSet.keepalivetime = dwKaTime;
520 tkaSet.keepaliveinterval = dwInterval;
521
522 if (!doWSAIOCtl(hSocket, SIO_KEEPALIVE_VALS, &tkaSet, sizeof(tkaSet),
523 &tkaRet, sizeof(tkaRet), &dwBytes, NULL, NULL))
524 {
525 return FALSE;
526 }
527
528 return TRUE;
529 }
530
531 BOOL IBaseSocket::doIOCtlSocket(SOCKET hSocket, LONG lCommand, DWORD *lpArgument)
532 {
533 if (ioctlsocket(hSocket, lCommand, lpArgument) == SOCKET_ERROR)
534 {
535 TRACE1("***** ERROR: ioctlsocket(%d) *****\n", GetLastError());
536 m_dwError = GetLastError();
537 return FALSE;
538 }
539
540 return TRUE;
541 }
542
543 BOOL IBaseSocket::doWSAIOCtl(SOCKET hSocket, DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
544 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
545 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
546 {
547 if (WSAIoctl(hSocket, dwIoCtlCode, lpInBuf, dwInBuf, lpOutBuf,
548 dwOutBuf, dwByteReturned, lpOverlapped, lpCompletionRoutine) == SOCKET_ERROR)
549 {
550 TRACE1("***** ERROR: WSAIoctl(%d) *****\n", GetLastError());
551 m_dwError = GetLastError();
552 return FALSE;
553 }
554
555 return TRUE;
556 }
557
558 BOOL IBaseSocket::doSend(SOCKET hSocket, const CByteArray &data)
559 {
560 CByteArray snd;
561 HEADER header;
562 size_t dataSize, hdrSize;
563 size_t dataPtr, hdrPtr;
564 LONG lEvent;
565 BOOL fResult;
566 int nRet;
567
568 lEvent = (hSocket == m_hSocket) ? m_lEvent : (FD_READ | FD_WRITE | FD_CLOSE);
569
570 if ((lEvent != 0) && (lEvent & FD_WRITE))
571 {
572 // FD_WRITE cancel
573 doAsyncSelect(hSocket, SM_EVENT, (lEvent ^ FD_WRITE));
574 }
575
576 dataSize = data.GetSize();
577 hdrSize = sizeof(HEADER);
578 dataPtr = 0;
579 hdrPtr = 0;
580 fResult = TRUE;
581
582 header.size = dataSize;
583 snd.SetSize(hdrSize);
584 CopyMemory(snd.GetData(), &header, hdrSize);
585 snd.FreeExtra();
586
587 do
588 {
589 // Send header
590 nRet = send(hSocket, DATA_SEND(snd.GetData() + hdrPtr), hdrSize, 0);
591
592 if (nRet == SOCKET_ERROR)
593 {
594 m_dwError = GetLastError();
595
596 if (m_dwError == WSAEWOULDBLOCK)
597 {
598 continue;
599 }
600 else
601 {
602 TRACE1("***** ERROR: send header(%d) *****\n", m_dwError);
603 fResult = FALSE;
604 break;
605 }
606 }
607 else
608 {
609 hdrPtr += nRet;
610 hdrSize -= nRet;
611 }
612 }
613 while (hdrSize > 0);
614
615 if (fResult)
616 {
617 do
618 {
619 // Send data
620 nRet = send(hSocket, DATA_SEND(data.GetData() + dataPtr), dataSize, 0);
621
622 if (nRet == SOCKET_ERROR)
623 {
624 m_dwError = GetLastError();
625
626 if (m_dwError == WSAEWOULDBLOCK)
627 {
628 continue;
629 }
630 else
631 {
632 TRACE1("***** ERROR: send data(%d) *****\n", m_dwError);
633 fResult = FALSE;
634 break;
635 }
636 }
637 else
638 {
639 dataPtr += nRet;
640 dataSize -= nRet;
641 }
642 }
643 while (dataSize > 0);
644 }
645
646 if ((lEvent != 0) && (lEvent & FD_WRITE))
647 {
648 // FD_WRITE setting
649 doAsyncSelect(hSocket, SM_EVENT, lEvent);
650 }
651
652 return fResult;
653 }
654
655 BOOL IBaseSocket::doReceive(SOCKET hSocket, CByteArray &data)
656 {
657 HEADER header;
658 size_t recvSize;
659 size_t dataSize;
660 size_t bufPtr;
661 BOOL fResult;
662 LONG lEvent;
663 int nRet;
664
665 lEvent = (hSocket == m_hSocket) ? m_lEvent : (FD_READ | FD_WRITE | FD_CLOSE);
666
667 if ((lEvent != 0) && (lEvent & FD_READ))
668 {
669 // FD_READ cancel
670 doAsyncSelect(hSocket, SM_EVENT, (lEvent ^ FD_READ));
671 }
672
673 // Receive header
674 nRet = recv(hSocket, DATA_RECEIVE(&header), sizeof(HEADER), MSG_PEEK);
675
676 if (nRet == sizeof(HEADER))
677 {
678 dataSize = header.size + sizeof(HEADER);
679 recvSize = dataSize;
680 bufPtr = 0;
681
682 data.RemoveAll();
683 data.SetSize(dataSize);
684 fResult = TRUE;
685
686 do
687 {
688 // Receive data
689 nRet = recv(hSocket, DATA_RECEIVE(data.GetData() + bufPtr), recvSize, 0);
690
691 if (nRet == SOCKET_ERROR)
692 {
693 m_dwError = GetLastError();
694
695 if (m_dwError == WSAEWOULDBLOCK)
696 {
697 continue;
698 }
699 else
700 {
701 TRACE1("***** ERROR: recv - Data(%d) *****\n", m_dwError);
702 fResult = FALSE;
703 break;
704 }
705 }
706 else
707 {
708 bufPtr += nRet;
709 recvSize -= nRet;
710 }
711 }
712 while (recvSize > 0);
713
714 // Header remove
715 if (data.GetSize() >= sizeof(HEADER))
716 {
717 data.RemoveAt(0, sizeof(HEADER));
718 }
719 }
720 else
721 {
722 TRACE1("***** ERROR: recv - Header(%d) *****\n", GetLastError());
723 m_dwError = GetLastError();
724 fResult = FALSE;
725 }
726
727 if ((lEvent != 0) && (lEvent & FD_READ))
728 {
729 // FD_READ setting
730 doAsyncSelect(hSocket, SM_EVENT, lEvent);
731 }
732
733 return fResult;
734 }
735
736 BOOL IBaseSocket::doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpSockAddr, int nSockAddrLen)
737 {
738 int nRet;
739
740 nRet = sendto(hSocket, reinterpret_cast<LPSTR>(const_cast<BYTE *>(data.GetData())),
741 SX_UDP_BUFSIZE, 0, lpSockAddr, nSockAddrLen);
742
743 if (nRet == SOCKET_ERROR)
744 {
745 TRACE1("***** ERROR: sendto(%d) *****\n", GetLastError());
746 m_dwError = GetLastError();
747 return FALSE;
748 }
749
750 return TRUE;
751 }
752
753 BOOL IBaseSocket::doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpSockAddr, int *lpSockAddrLen)
754 {
755 int nRet;
756 int nLenSA = sizeof(SOCKADDR);
757
758 if (data.GetSize() != SX_UDP_BUFSIZE)
759 {
760 data.RemoveAll();
761 data.SetSize(SX_UDP_BUFSIZE);
762 }
763
764 nRet = recvfrom(hSocket, reinterpret_cast<LPSTR>(data.GetData()),
765 SX_UDP_BUFSIZE, 0, lpSockAddr, lpSockAddrLen);
766
767 if (nRet == SOCKET_ERROR)
768 {
769 TRACE1("***** ERROR: recvfrom(%d) *****\n", GetLastError());
770 m_dwError = GetLastError();
771 return FALSE;
772 }
773
774 data.FreeExtra();
775
776 return TRUE;
777 }
778
779 //////////////////////////////////////////////////////////////////////////
780

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