Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SocketX/BaseSocket.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (show 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 #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