Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

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