Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide 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 sho1get 11 #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 sho1get 13 doGetHostByName(hTask, nErrorCode);
108 sho1get 11
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 sho1get 13 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 sho1get 11 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 sho1get 13 HEADER header;
562     size_t dataSize, hdrSize;
563     size_t dataPtr, hdrPtr;
564 sho1get 11 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 sho1get 13 hdrSize = sizeof(HEADER);
578     dataPtr = 0;
579     hdrPtr = 0;
580 sho1get 11 fResult = TRUE;
581    
582 sho1get 13 header.size = dataSize;
583     snd.SetSize(hdrSize);
584     CopyMemory(snd.GetData(), &header, hdrSize);
585 sho1get 11 snd.FreeExtra();
586    
587 sho1get 13 do
588 sho1get 11 {
589 sho1get 13 // Send header
590     nRet = send(hSocket, DATA_SEND(snd.GetData() + hdrPtr), hdrSize, 0);
591 sho1get 11
592     if (nRet == SOCKET_ERROR)
593     {
594     m_dwError = GetLastError();
595    
596     if (m_dwError == WSAEWOULDBLOCK)
597     {
598     continue;
599     }
600     else
601     {
602 sho1get 13 TRACE1("***** ERROR: send header(%d) *****\n", m_dwError);
603 sho1get 11 fResult = FALSE;
604     break;
605     }
606     }
607     else
608     {
609 sho1get 13 hdrPtr += nRet;
610     hdrSize -= nRet;
611 sho1get 11 }
612 sho1get 13 }
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 sho1get 11 }
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 sho1get 13 nRet = recv(hSocket, DATA_RECEIVE(&header), sizeof(HEADER), MSG_PEEK);
675 sho1get 11
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 sho1get 13 nRet = recv(hSocket, DATA_RECEIVE(data.GetData() + bufPtr), recvSize, 0);
690 sho1get 11
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