Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (show 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: 18299 byte(s)
Update_20100628
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 if (!doCloseSocket(m_hSocket))
161 {
162 return FALSE;
163 }
164
165 m_lEvent = 0;
166 m_fInit = FALSE;
167
168 return TRUE;
169 }
170
171 BOOL IBaseSocket::IsLANConnection(const LPSOCKADDR lpsAddr)
172 {
173 SOCKADDR_IN sAddrIn;
174 CopyMemory(&sAddrIn, lpsAddr, sizeof(sAddrIn));
175 return (m_LocalNet.dwNet == (m_LocalNet.dwMask & sAddrIn.sin_addr.s_addr));
176 }
177
178 void IBaseSocket::MakeSockAddrIN(LPSOCKADDR_IN lpsAddrIn, DWORD dwAddress,
179 WORD wPort, UINT nFamily)
180 {
181 ZeroMemory(lpsAddrIn, sizeof(SOCKADDR_IN));
182 lpsAddrIn->sin_port = htons(wPort);
183 lpsAddrIn->sin_family = nFamily;
184 lpsAddrIn->sin_addr.s_addr = dwAddress;
185 }
186
187 void IBaseSocket::ConvertSockAddrToNetAddr(const LPSOCKADDR lpsAddr, NETADDR &NetAddr)
188 {
189 SOCKADDR_IN sAddrIn;
190 CopyMemory(&sAddrIn, lpsAddr, sizeof(sAddrIn));
191 NetAddr.wPort = ntohs(sAddrIn.sin_port);
192 NetAddr.nFamily = sAddrIn.sin_family;
193 NetAddr.dwAddress = sAddrIn.sin_addr.s_addr;
194 }
195
196 BOOL IBaseSocket::Shutdown(int nFlag)
197 {
198 return doShutdown(m_hSocket, nFlag);
199 }
200
201 BOOL IBaseSocket::AsyncSelect(LONG lEvent)
202 {
203 if (doAsyncSelect(m_hSocket, SM_EVENT, lEvent))
204 {
205 m_lEvent = lEvent;
206 m_fBlocking = FALSE;
207 return TRUE;
208 }
209
210 return FALSE;
211 }
212
213 BOOL IBaseSocket::AsyncGetHostByName(const LPCSTR szHostName)
214 {
215 return doAsyncGetHostByName(SM_GETHOST, szHostName, m_HostName.buf, sizeof(m_HostName.buf));
216 }
217
218 BOOL IBaseSocket::SetBlocking()
219 {
220 BOOL fRet = TRUE;
221
222 if (m_fBlocking)
223 {
224 fRet = doSetBlocking(m_hSocket);
225
226 if (fRet)
227 {
228 m_fBlocking = TRUE;
229 m_lEvent = 0;
230 }
231 }
232
233 return FALSE;
234 }
235
236 BOOL IBaseSocket::Bind(WORD wPort, DWORD dwAddress)
237 {
238 if (!doBind(m_hSocket, wPort, dwAddress))
239 {
240 return FALSE;
241 }
242
243 m_wBindPort = wPort;
244
245 return TRUE;
246 }
247
248 BOOL IBaseSocket::GetSockName(LPSOCKADDR lpsAddr)
249 {
250 return doGetSockName(m_hSocket, lpsAddr);
251 }
252
253 BOOL IBaseSocket::GetPeerName(LPSOCKADDR lpsAddr)
254 {
255 return doGetPeerName(m_hSocket, lpsAddr);
256 }
257
258 BOOL IBaseSocket::SetSockOpt(int nOptionName, LPCSTR lpOptionValue,
259 int nOptionLen, int nLevel)
260 {
261 return doSetSockOpt(m_hSocket, nLevel, nOptionName, lpOptionValue, nOptionLen);
262 }
263
264 BOOL IBaseSocket::GetSockOpt(int nOptionName, LPSTR lpOptionValue,
265 int *lpOptionLen, int nLevel)
266 {
267 return doGetSockOpt(m_hSocket, nLevel, nOptionName, lpOptionValue, lpOptionLen);
268 }
269
270 BOOL IBaseSocket::SetSendTimeout(DWORD dwTimeout)
271 {
272 return doSetSendTimeout(m_hSocket, dwTimeout);
273 }
274
275 BOOL IBaseSocket::SetRecieveTimeout(DWORD dwTimeout)
276 {
277 return doSetReceiveTimeout(m_hSocket, dwTimeout);
278 }
279
280 BOOL IBaseSocket::SetSendBufferSize(DWORD dwBufSize)
281 {
282 if (!doSetSendBufferSize(m_hSocket, dwBufSize))
283 {
284 return FALSE;
285 }
286
287 m_dwSendBufSize = dwBufSize;
288
289 return TRUE;
290 }
291
292 BOOL IBaseSocket::SetReceiveBufferSize(DWORD dwBufSize)
293 {
294 if (!doSetReceiveBufferSize(m_hSocket, dwBufSize))
295 {
296 return FALSE;
297 }
298
299 m_dwReceiveBufSize = dwBufSize;
300
301 return TRUE;
302 }
303
304 BOOL IBaseSocket::SetBufferSize(DWORD dwBufSize)
305 {
306 return (SetSendBufferSize(dwBufSize) && SetReceiveBufferSize(dwBufSize));
307 }
308
309 BOOL IBaseSocket::SetKeepAlive(DWORD dwTime, DWORD dwInterval)
310 {
311 return doSetKeepAlive(m_hSocket, dwTime, dwInterval);
312 }
313
314 BOOL IBaseSocket::SetReuseAddr(BOOL flag)
315 {
316 return doSetReuseAddr(m_hSocket, flag);
317 }
318
319 BOOL IBaseSocket::IOCtlSocket(LONG lCommand, DWORD *lpArgument)
320 {
321 return doIOCtlSocket(m_hSocket, lCommand, lpArgument);
322 }
323
324 BOOL IBaseSocket::WSAIOCtl(DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf,
325 LPVOID lpOutBuf, DWORD dwOutBuf, LPDWORD dwByteReturned,
326 LPWSAOVERLAPPED lpOverlapped,
327 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
328 {
329 return doWSAIOCtl(m_hSocket, dwIoCtlCode, lpInBuf, dwInBuf, lpOutBuf, dwOutBuf,
330 dwByteReturned, lpOverlapped, lpCompletionRoutine);
331 }
332
333 void IBaseSocket::GetLocalAddress(NETADDR &NetAddr)
334 {
335 ConvertSockAddrToNetAddr(&m_LocalAddr, NetAddr);
336 }
337
338 void IBaseSocket::GetPeerAddress(NETADDR &NetAddr)
339 {
340 ConvertSockAddrToNetAddr(&m_PeerAddr, NetAddr);
341 }
342
343 BOOL IBaseSocket::Send(const CByteArray &data)
344 {
345 return doSend(m_hSocket, data);
346 }
347
348 BOOL IBaseSocket::Receive(CByteArray &data)
349 {
350 return doReceive(m_hSocket, data);
351 }
352
353 BOOL IBaseSocket::SendTo(const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen)
354 {
355 return doSendTo(m_hSocket, data, lpsAddr, nSockAddrLen);
356 }
357
358 BOOL IBaseSocket::ReceiveFrom(CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen)
359 {
360 return doReceiveFrom(m_hSocket, data, lpsAddr, lpsAddrLen);
361 }
362
363 //////////////////////////////////////////////////////////////////////////
364
365 BOOL IBaseSocket::doGetHostByName(HANDLE hTask, int nErrorCode)
366 {
367 LPHOSTENT lpHostEnt = reinterpret_cast<LPHOSTENT>(m_HostName.buf);
368
369 if (m_HostName.hTask != hTask)
370 {
371 TRACE0("***** ERROR: GetHostByName(Handle) *****\n");
372 return FALSE;
373 }
374
375 m_SockMsg.pCallback->OnGetHostByNameMessage(lpHostEnt);
376
377 return TRUE;
378 }
379
380 BOOL IBaseSocket::doCreateSocket(SOCKMSG SockMsg, int nType, int nProtocol)
381 {
382 if (!IBaseSocket::CreateSocketWindow())
383 {
384 return FALSE;
385 }
386
387 SetCallback(SockMsg);
388
389 m_hSocket = socket(AF_INET, nType, nProtocol);
390
391 if (m_hSocket == INVALID_SOCKET)
392 {
393 TRACE1("***** ERROR: socket(%d) *****\n", GetLastError());
394 m_dwError = GetLastError();
395 return FALSE;
396 }
397
398 SetSendTimeout(m_dwSendTimeout);
399 SetRecieveTimeout(m_dwReceiveTimeout);
400
401 return TRUE;
402 }
403
404 BOOL IBaseSocket::doCloseSocket(SOCKET hSocket)
405 {
406 if (closesocket(hSocket) != 0)
407 {
408 TRACE1("***** ERROR: closesocket(%d) *****\n", GetLastError());
409 m_dwError = GetLastError();
410 return FALSE;
411 }
412
413 hSocket = INVALID_SOCKET;
414
415 return TRUE;
416 }
417
418 BOOL IBaseSocket::doShutdown(SOCKET hSocket, int nFlag)
419 {
420 if (shutdown(hSocket, nFlag) == SOCKET_ERROR)
421 {
422 TRACE1("***** ERROR: shutdown(%d) *****\n", GetLastError());
423 m_dwError = GetLastError();
424 return FALSE;
425 }
426
427 return TRUE;
428 }
429
430 BOOL IBaseSocket::doAsyncSelect(SOCKET hSocket, UINT uMsg, LONG lEvent)
431 {
432 if (WSAAsyncSelect(hSocket, m_hWnd, SM_EVENT, lEvent) != 0)
433 {
434 TRACE1("***** ERROR: WSAAsyncSelect(%d) *****\n", GetLastError());
435 m_dwError = GetLastError();
436 return FALSE;
437 }
438
439 return TRUE;
440 }
441
442 BOOL IBaseSocket::doAsyncGetHostByName(UINT uMsg, const LPCSTR szHostName, LPSTR szHostEnt, int nBufLen)
443 {
444 ZeroMemory(szHostEnt, nBufLen);
445
446 m_HostName.hTask = WSAAsyncGetHostByName(m_hWnd, uMsg, szHostName, szHostEnt, nBufLen);
447
448 if (m_HostName.hTask != 0)
449 {
450 TRACE1("***** ERROR: WSAAsyncGetHostByName(%d) *****\n", GetLastError());
451 m_dwError = GetLastError();
452 return FALSE;
453 }
454
455 return TRUE;
456 }
457
458 BOOL IBaseSocket::doSetBlocking(SOCKET hSocket)
459 {
460 DWORD dwVal = 0;
461 return (doAsyncSelect(hSocket, 0, 0) & doIOCtlSocket(hSocket, FIONBIO, &dwVal));
462 }
463
464 BOOL IBaseSocket::doBind(SOCKET hSocket, WORD wPort, DWORD dwAddress)
465 {
466 SOCKADDR_IN sAddrIn;
467
468 MakeSockAddrIN(&sAddrIn, dwAddress, wPort);
469
470 if (bind(hSocket, (LPSOCKADDR)&sAddrIn, sizeof(sAddrIn)) == SOCKET_ERROR)
471 {
472 TRACE1("***** ERROR: bind(%d) *****\n", GetLastError());
473 m_dwError = GetLastError();
474 return FALSE;
475 }
476
477 return TRUE;
478 }
479
480 BOOL IBaseSocket::doGetSockName(SOCKET hSocket, LPSOCKADDR lpsAddr)
481 {
482 int nLenSA = sizeof(SOCKADDR);
483
484 if (getsockname(hSocket, lpsAddr, &nLenSA) != 0)
485 {
486 TRACE1("***** ERROR: getsockname(%d) *****\n", GetLastError());
487 m_dwError = GetLastError();
488 return FALSE;
489 }
490
491 return TRUE;
492 }
493
494 BOOL IBaseSocket::doGetPeerName(SOCKET hSocket, LPSOCKADDR lpsAddr)
495 {
496 int nLenSA = sizeof(SOCKADDR);
497
498 if (getpeername(hSocket, lpsAddr, &nLenSA) != 0)
499 {
500 TRACE1("***** ERROR: getpeername(%d) *****\n", GetLastError());
501 m_dwError = GetLastError();
502 return FALSE;
503 }
504
505 return TRUE;
506 }
507
508 BOOL IBaseSocket::doSetSockOpt(SOCKET hSocket, int nLevel, int nOptionName,
509 LPCSTR lpOptionValue, int nOptionLen)
510 {
511 if (setsockopt(hSocket, nLevel, nOptionName, lpOptionValue, nOptionLen) == SOCKET_ERROR)
512 {
513 TRACE2("***** ERROR: setsockopt(%d) option(%d) *****\n", GetLastError(), nOptionName);
514 m_dwError = GetLastError();
515 return FALSE;
516 }
517
518 return TRUE;
519 }
520
521 BOOL IBaseSocket::doGetSockOpt(SOCKET hSocket, int nLevel, int nOptionName,
522 LPSTR lpOptionValue, int *lpOptionLen)
523 {
524 if (getsockopt(hSocket, nLevel, nOptionName, lpOptionValue, lpOptionLen) == SOCKET_ERROR)
525 {
526 TRACE2("***** ERROR: getsockopt(%d) option(%d) *****\n", GetLastError(), nOptionName);
527 m_dwError = GetLastError();
528 return FALSE;
529 }
530
531 return TRUE;
532 }
533
534 BOOL IBaseSocket::doSetSendTimeout(SOCKET hSocket, DWORD dwTimeout)
535 {
536 return doSetSockOpt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (LPSTR)&dwTimeout, sizeof(dwTimeout));
537 }
538
539 BOOL IBaseSocket::doSetReceiveTimeout(SOCKET hSocket, DWORD dwTimeout)
540 {
541 return doSetSockOpt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (LPSTR)&dwTimeout, sizeof(dwTimeout));
542 }
543
544 BOOL IBaseSocket::doSetSendBufferSize(SOCKET hSocket, DWORD dwBufSize)
545 {
546 return doSetSockOpt(hSocket, SOL_SOCKET, SO_SNDBUF, (LPSTR)&dwBufSize, sizeof(dwBufSize));
547 }
548
549 BOOL IBaseSocket::doSetReceiveBufferSize(SOCKET hSocket, DWORD dwBufSize)
550 {
551 return doSetSockOpt(hSocket, SOL_SOCKET, SO_RCVBUF, (LPSTR)&dwBufSize, sizeof(dwBufSize));
552 }
553
554 BOOL IBaseSocket::doSetReuseAddr(SOCKET hSocket, BOOL flag)
555 {
556 return doSetSockOpt(hSocket, SOL_SOCKET, SO_REUSEADDR, (LPSTR)&flag, sizeof(flag));
557 }
558
559 BOOL IBaseSocket::doSetKeepAlive(SOCKET hSocket, DWORD dwKaTime, DWORD dwInterval)
560 {
561 struct tcp_keepalive tkaSet, tkaRet;
562 DWORD dwBytes;
563 BOOL flag = TRUE;
564
565 if (!doSetSockOpt(hSocket, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&flag, sizeof(flag)))
566 {
567 return FALSE;
568 }
569
570 ZeroMemory(&tkaSet, sizeof(tkaSet));
571 ZeroMemory(&tkaRet, sizeof(tkaRet));
572 tkaSet.onoff = 1;
573 tkaSet.keepalivetime = dwKaTime;
574 tkaSet.keepaliveinterval = dwInterval;
575
576 if (!doWSAIOCtl(hSocket, SIO_KEEPALIVE_VALS, &tkaSet, sizeof(tkaSet),
577 &tkaRet, sizeof(tkaRet), &dwBytes, NULL, NULL))
578 {
579 return FALSE;
580 }
581
582 return TRUE;
583 }
584
585 BOOL IBaseSocket::doIOCtlSocket(SOCKET hSocket, LONG lCommand, DWORD *lpArgument)
586 {
587 if (ioctlsocket(hSocket, lCommand, lpArgument) == SOCKET_ERROR)
588 {
589 TRACE1("***** ERROR: ioctlsocket(%d) *****\n", GetLastError());
590 m_dwError = GetLastError();
591 return FALSE;
592 }
593
594 return TRUE;
595 }
596
597 BOOL IBaseSocket::doWSAIOCtl(SOCKET hSocket, DWORD dwIoCtlCode, LPVOID lpInBuf, DWORD dwInBuf, LPVOID lpOutBuf,
598 DWORD dwOutBuf, LPDWORD dwByteReturned, LPWSAOVERLAPPED lpOverlapped,
599 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
600 {
601 if (WSAIoctl(hSocket, dwIoCtlCode, lpInBuf, dwInBuf, lpOutBuf,
602 dwOutBuf, dwByteReturned, lpOverlapped, lpCompletionRoutine) == SOCKET_ERROR)
603 {
604 TRACE1("***** ERROR: WSAIoctl(%d) *****\n", GetLastError());
605 m_dwError = GetLastError();
606 return FALSE;
607 }
608
609 return TRUE;
610 }
611
612 BOOL IBaseSocket::doSend(SOCKET hSocket, const CByteArray &data)
613 {
614 CByteArray snd;
615 HEADER header;
616 size_t dataSize, hdrSize;
617 size_t dataPtr, hdrPtr;
618 LONG lEvent;
619 BOOL fResult;
620 int nRet;
621
622 lEvent = (hSocket == m_hSocket) ? m_lEvent : (FD_READ | FD_WRITE | FD_CLOSE);
623
624 if ((lEvent != 0) && (lEvent & FD_WRITE))
625 {
626 // FD_WRITE cancel
627 doAsyncSelect(hSocket, SM_EVENT, (lEvent ^ FD_WRITE));
628 }
629
630 dataSize = data.GetSize();
631 hdrSize = sizeof(HEADER);
632 dataPtr = 0;
633 hdrPtr = 0;
634 fResult = TRUE;
635
636 header.size = dataSize;
637 snd.SetSize(hdrSize);
638 snd.FreeExtra();
639 CopyMemory(snd.GetData(), &header, hdrSize);
640
641 do
642 {
643 // Send header
644 nRet = send(hSocket, DATA_SEND(snd.GetData() + hdrPtr), hdrSize, 0);
645
646 if (nRet == SOCKET_ERROR)
647 {
648 m_dwError = GetLastError();
649
650 if (m_dwError == WSAEWOULDBLOCK)
651 {
652 continue;
653 }
654 else
655 {
656 TRACE1("***** ERROR: send header(%d) *****\n", m_dwError);
657 fResult = FALSE;
658 break;
659 }
660 }
661 else
662 {
663 hdrPtr += nRet;
664 hdrSize -= nRet;
665 }
666 }
667 while (hdrSize > 0);
668
669 if (fResult)
670 {
671 do
672 {
673 // Send data
674 nRet = send(hSocket, DATA_SEND(data.GetData() + dataPtr), dataSize, 0);
675
676 if (nRet == SOCKET_ERROR)
677 {
678 m_dwError = GetLastError();
679
680 if (m_dwError == WSAEWOULDBLOCK)
681 {
682 continue;
683 }
684 else
685 {
686 TRACE1("***** ERROR: send data(%d) *****\n", m_dwError);
687 fResult = FALSE;
688 break;
689 }
690 }
691 else
692 {
693 dataPtr += nRet;
694 dataSize -= nRet;
695 }
696 }
697 while (dataSize > 0);
698 }
699
700 if ((lEvent != 0) && (lEvent & FD_WRITE))
701 {
702 // FD_WRITE setting
703 doAsyncSelect(hSocket, SM_EVENT, lEvent);
704 }
705
706 return fResult;
707 }
708
709 BOOL IBaseSocket::doReceive(SOCKET hSocket, CByteArray &data)
710 {
711 HEADER header;
712 size_t recvSize;
713 size_t dataSize;
714 size_t bufPtr;
715 BOOL fResult;
716 LONG lEvent;
717 int nRet;
718
719 lEvent = (hSocket == m_hSocket) ? m_lEvent : (FD_READ | FD_WRITE | FD_CLOSE);
720
721 if ((lEvent != 0) && (lEvent & FD_READ))
722 {
723 // FD_READ cancel
724 doAsyncSelect(hSocket, SM_EVENT, (lEvent ^ FD_READ));
725 }
726
727 // Receive header
728 nRet = recv(hSocket, DATA_RECEIVE(&header), sizeof(HEADER), MSG_PEEK);
729
730 if (nRet == sizeof(HEADER))
731 {
732 dataSize = header.size + sizeof(HEADER);
733 recvSize = dataSize;
734 bufPtr = 0;
735
736 data.RemoveAll();
737 data.SetSize(dataSize);
738 fResult = TRUE;
739
740 do
741 {
742 // Receive data
743 nRet = recv(hSocket, DATA_RECEIVE(data.GetData() + bufPtr), recvSize, 0);
744
745 if (nRet == SOCKET_ERROR)
746 {
747 m_dwError = GetLastError();
748
749 if (m_dwError == WSAEWOULDBLOCK)
750 {
751 continue;
752 }
753 else
754 {
755 TRACE1("***** ERROR: recv - Data(%d) *****\n", m_dwError);
756 fResult = FALSE;
757 break;
758 }
759 }
760 else
761 {
762 bufPtr += nRet;
763 recvSize -= nRet;
764 }
765 }
766 while (recvSize > 0);
767
768 // Header remove
769 if (data.GetSize() >= sizeof(HEADER))
770 {
771 data.RemoveAt(0, sizeof(HEADER));
772 }
773 }
774 else
775 {
776 TRACE1("***** ERROR: recv - Header(%d) *****\n", GetLastError());
777 m_dwError = GetLastError();
778 fResult = FALSE;
779 }
780
781 if ((lEvent != 0) && (lEvent & FD_READ))
782 {
783 // FD_READ setting
784 doAsyncSelect(hSocket, SM_EVENT, lEvent);
785 }
786
787 return fResult;
788 }
789
790 BOOL IBaseSocket::doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen)
791 {
792 int nRet;
793 DWORD dwBufSize = min(m_dwSendBufSize, static_cast<DWORD>(data.GetSize()));
794
795 nRet = sendto(hSocket, reinterpret_cast<LPSTR>(const_cast<BYTE *>(data.GetData())),
796 dwBufSize, 0, lpsAddr, nSockAddrLen);
797
798 if (nRet == SOCKET_ERROR)
799 {
800 TRACE1("***** ERROR: sendto(%d) *****\n", GetLastError());
801 m_dwError = GetLastError();
802 return FALSE;
803 }
804
805 return TRUE;
806 }
807
808 BOOL IBaseSocket::doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen)
809 {
810 int nRet;
811 int nLenSA = sizeof(SOCKADDR);
812
813 data.SetSize(m_dwReceiveBufSize);
814 data.FreeExtra();
815
816 nRet = recvfrom(hSocket, reinterpret_cast<LPSTR>(data.GetData()),
817 m_dwReceiveBufSize, 0, lpsAddr, lpsAddrLen);
818
819 if (nRet == SOCKET_ERROR)
820 {
821 TRACE1("***** ERROR: recvfrom(%d) *****\n", GetLastError());
822 m_dwError = GetLastError();
823 return FALSE;
824 }
825
826 return TRUE;
827 }
828
829 //////////////////////////////////////////////////////////////////////////
830

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