Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (hide 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 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 sho1get 16 if (!doCloseSocket(m_hSocket))
161     {
162     return FALSE;
163     }
164    
165     m_lEvent = 0;
166     m_fInit = FALSE;
167    
168     return TRUE;
169 sho1get 11 }
170    
171 sho1get 16 BOOL IBaseSocket::IsLANConnection(const LPSOCKADDR lpsAddr)
172 sho1get 11 {
173 sho1get 16 SOCKADDR_IN sAddrIn;
174     CopyMemory(&sAddrIn, lpsAddr, sizeof(sAddrIn));
175     return (m_LocalNet.dwNet == (m_LocalNet.dwMask & sAddrIn.sin_addr.s_addr));
176 sho1get 11 }
177    
178 sho1get 16 void IBaseSocket::MakeSockAddrIN(LPSOCKADDR_IN lpsAddrIn, DWORD dwAddress,
179     WORD wPort, UINT nFamily)
180 sho1get 11 {
181 sho1get 16 ZeroMemory(lpsAddrIn, sizeof(SOCKADDR_IN));
182     lpsAddrIn->sin_port = htons(wPort);
183     lpsAddrIn->sin_family = nFamily;
184     lpsAddrIn->sin_addr.s_addr = dwAddress;
185 sho1get 11 }
186    
187 sho1get 16 void IBaseSocket::ConvertSockAddrToNetAddr(const LPSOCKADDR lpsAddr, NETADDR &NetAddr)
188 sho1get 11 {
189 sho1get 16 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 sho1get 11 }
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 sho1get 16 if (!doBind(m_hSocket, wPort, dwAddress))
239     {
240     return FALSE;
241     }
242    
243     m_wBindPort = wPort;
244    
245     return TRUE;
246 sho1get 11 }
247    
248 sho1get 16 BOOL IBaseSocket::GetSockName(LPSOCKADDR lpsAddr)
249 sho1get 11 {
250 sho1get 16 return doGetSockName(m_hSocket, lpsAddr);
251 sho1get 11 }
252    
253 sho1get 16 BOOL IBaseSocket::GetPeerName(LPSOCKADDR lpsAddr)
254 sho1get 11 {
255 sho1get 16 return doGetPeerName(m_hSocket, lpsAddr);
256 sho1get 11 }
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 sho1get 16 if (!doSetSendBufferSize(m_hSocket, dwBufSize))
283     {
284     return FALSE;
285     }
286    
287     m_dwSendBufSize = dwBufSize;
288    
289     return TRUE;
290 sho1get 11 }
291    
292     BOOL IBaseSocket::SetReceiveBufferSize(DWORD dwBufSize)
293     {
294 sho1get 16 if (!doSetReceiveBufferSize(m_hSocket, dwBufSize))
295     {
296     return FALSE;
297     }
298    
299     m_dwReceiveBufSize = dwBufSize;
300    
301     return TRUE;
302 sho1get 11 }
303    
304 sho1get 16 BOOL IBaseSocket::SetBufferSize(DWORD dwBufSize)
305     {
306     return (SetSendBufferSize(dwBufSize) && SetReceiveBufferSize(dwBufSize));
307     }
308    
309 sho1get 11 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 sho1get 16 BOOL IBaseSocket::SendTo(const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen)
354 sho1get 11 {
355 sho1get 16 return doSendTo(m_hSocket, data, lpsAddr, nSockAddrLen);
356 sho1get 11 }
357    
358 sho1get 16 BOOL IBaseSocket::ReceiveFrom(CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen)
359 sho1get 11 {
360 sho1get 16 return doReceiveFrom(m_hSocket, data, lpsAddr, lpsAddrLen);
361 sho1get 11 }
362    
363     //////////////////////////////////////////////////////////////////////////
364    
365 sho1get 13 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 sho1get 16 m_SockMsg.pCallback->OnGetHostByNameMessage(lpHostEnt);
376 sho1get 13
377     return TRUE;
378     }
379    
380 sho1get 16 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 sho1get 11 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 sho1get 16 SOCKADDR_IN sAddrIn;
467 sho1get 11
468 sho1get 16 MakeSockAddrIN(&sAddrIn, dwAddress, wPort);
469 sho1get 11
470 sho1get 16 if (bind(hSocket, (LPSOCKADDR)&sAddrIn, sizeof(sAddrIn)) == SOCKET_ERROR)
471 sho1get 11 {
472     TRACE1("***** ERROR: bind(%d) *****\n", GetLastError());
473     m_dwError = GetLastError();
474     return FALSE;
475     }
476    
477     return TRUE;
478     }
479    
480 sho1get 16 BOOL IBaseSocket::doGetSockName(SOCKET hSocket, LPSOCKADDR lpsAddr)
481 sho1get 11 {
482     int nLenSA = sizeof(SOCKADDR);
483    
484 sho1get 16 if (getsockname(hSocket, lpsAddr, &nLenSA) != 0)
485 sho1get 11 {
486     TRACE1("***** ERROR: getsockname(%d) *****\n", GetLastError());
487     m_dwError = GetLastError();
488     return FALSE;
489     }
490    
491     return TRUE;
492     }
493    
494 sho1get 16 BOOL IBaseSocket::doGetPeerName(SOCKET hSocket, LPSOCKADDR lpsAddr)
495 sho1get 11 {
496     int nLenSA = sizeof(SOCKADDR);
497    
498 sho1get 16 if (getpeername(hSocket, lpsAddr, &nLenSA) != 0)
499 sho1get 11 {
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 sho1get 13 HEADER header;
616     size_t dataSize, hdrSize;
617     size_t dataPtr, hdrPtr;
618 sho1get 11 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 sho1get 13 hdrSize = sizeof(HEADER);
632     dataPtr = 0;
633     hdrPtr = 0;
634 sho1get 11 fResult = TRUE;
635    
636 sho1get 13 header.size = dataSize;
637     snd.SetSize(hdrSize);
638 sho1get 16 snd.FreeExtra();
639 sho1get 13 CopyMemory(snd.GetData(), &header, hdrSize);
640 sho1get 11
641 sho1get 13 do
642 sho1get 11 {
643 sho1get 13 // Send header
644     nRet = send(hSocket, DATA_SEND(snd.GetData() + hdrPtr), hdrSize, 0);
645 sho1get 11
646     if (nRet == SOCKET_ERROR)
647     {
648     m_dwError = GetLastError();
649    
650     if (m_dwError == WSAEWOULDBLOCK)
651     {
652     continue;
653     }
654     else
655     {
656 sho1get 13 TRACE1("***** ERROR: send header(%d) *****\n", m_dwError);
657 sho1get 11 fResult = FALSE;
658     break;
659     }
660     }
661     else
662     {
663 sho1get 13 hdrPtr += nRet;
664     hdrSize -= nRet;
665 sho1get 11 }
666 sho1get 13 }
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 sho1get 11 }
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 sho1get 13 nRet = recv(hSocket, DATA_RECEIVE(&header), sizeof(HEADER), MSG_PEEK);
729 sho1get 11
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 sho1get 13 nRet = recv(hSocket, DATA_RECEIVE(data.GetData() + bufPtr), recvSize, 0);
744 sho1get 11
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 sho1get 16 BOOL IBaseSocket::doSendTo(SOCKET hSocket, const CByteArray &data, const LPSOCKADDR lpsAddr, int nSockAddrLen)
791 sho1get 11 {
792 sho1get 16 int nRet;
793     DWORD dwBufSize = min(m_dwSendBufSize, static_cast<DWORD>(data.GetSize()));
794 sho1get 11
795     nRet = sendto(hSocket, reinterpret_cast<LPSTR>(const_cast<BYTE *>(data.GetData())),
796 sho1get 16 dwBufSize, 0, lpsAddr, nSockAddrLen);
797 sho1get 11
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 sho1get 16 BOOL IBaseSocket::doReceiveFrom(SOCKET hSocket, CByteArray &data, LPSOCKADDR lpsAddr, int *lpsAddrLen)
809 sho1get 11 {
810     int nRet;
811     int nLenSA = sizeof(SOCKADDR);
812    
813 sho1get 16 data.SetSize(m_dwReceiveBufSize);
814     data.FreeExtra();
815 sho1get 11
816     nRet = recvfrom(hSocket, reinterpret_cast<LPSTR>(data.GetData()),
817 sho1get 16 m_dwReceiveBufSize, 0, lpsAddr, lpsAddrLen);
818 sho1get 11
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