| 104 |
int nErrorCode = WSAGETSELECTERROR(lParam); |
int nErrorCode = WSAGETSELECTERROR(lParam); |
| 105 |
HANDLE hTask = (HANDLE)wParam; |
HANDLE hTask = (HANDLE)wParam; |
| 106 |
|
|
| 107 |
OnGetHostByName(hTask, nErrorCode); |
doGetHostByName(hTask, nErrorCode); |
| 108 |
|
|
| 109 |
return 0; |
return 0; |
| 110 |
} |
} |
| 111 |
|
|
|
void IBaseSocket::OnGetHostByName(HANDLE hTask, int nErrorCode) |
|
|
{ |
|
|
LPHOSTENT lpHostEnt = reinterpret_cast<LPHOSTENT>(m_HostName.buf); |
|
|
|
|
|
if (m_HostName.hTask != hTask) |
|
|
{ |
|
|
TRACE0("***** ERROR: GetHostByName(Handle) *****\n"); |
|
|
return; |
|
|
} |
|
|
|
|
|
m_SockMsg.pTgtObj->OnGetHostByNameMessage(lpHostEnt); |
|
|
} |
|
|
|
|
| 112 |
BOOL IBaseSocket::CreateSocketWindow() |
BOOL IBaseSocket::CreateSocketWindow() |
| 113 |
{ |
{ |
| 114 |
CString strClass; |
CString strClass; |
| 329 |
|
|
| 330 |
////////////////////////////////////////////////////////////////////////// |
////////////////////////////////////////////////////////////////////////// |
| 331 |
|
|
| 332 |
|
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 |
BOOL IBaseSocket::doCloseSocket(SOCKET hSocket) |
BOOL IBaseSocket::doCloseSocket(SOCKET hSocket) |
| 348 |
{ |
{ |
| 349 |
if (closesocket(hSocket) != 0) |
if (closesocket(hSocket) != 0) |
| 558 |
BOOL IBaseSocket::doSend(SOCKET hSocket, const CByteArray &data) |
BOOL IBaseSocket::doSend(SOCKET hSocket, const CByteArray &data) |
| 559 |
{ |
{ |
| 560 |
CByteArray snd; |
CByteArray snd; |
| 561 |
size_t dataSize; |
HEADER header; |
| 562 |
size_t sendSize; |
size_t dataSize, hdrSize; |
| 563 |
size_t bufPtr; |
size_t dataPtr, hdrPtr; |
| 564 |
LONG lEvent; |
LONG lEvent; |
| 565 |
BOOL fResult; |
BOOL fResult; |
| 566 |
int nRet; |
int nRet; |
| 574 |
} |
} |
| 575 |
|
|
| 576 |
dataSize = data.GetSize(); |
dataSize = data.GetSize(); |
| 577 |
sendSize = dataSize + sizeof(HEADER); |
hdrSize = sizeof(HEADER); |
| 578 |
bufPtr = 0; |
dataPtr = 0; |
| 579 |
|
hdrPtr = 0; |
| 580 |
fResult = TRUE; |
fResult = TRUE; |
| 581 |
|
|
| 582 |
snd.SetSize(sendSize); |
header.size = dataSize; |
| 583 |
((LPHEADER)snd.GetData())->size = dataSize; |
snd.SetSize(hdrSize); |
| 584 |
CopyMemory((snd.GetData() + sizeof(HEADER)), data.GetData(), dataSize); |
CopyMemory(snd.GetData(), &header, hdrSize); |
| 585 |
snd.FreeExtra(); |
snd.FreeExtra(); |
| 586 |
|
|
| 587 |
do |
do |
| 588 |
{ |
{ |
| 589 |
nRet = send(hSocket, reinterpret_cast<const LPSTR>(snd.GetData() + bufPtr), sendSize, 0); |
// Send header |
| 590 |
|
nRet = send(hSocket, DATA_SEND(snd.GetData() + hdrPtr), hdrSize, 0); |
| 591 |
|
|
| 592 |
if (nRet == SOCKET_ERROR) |
if (nRet == SOCKET_ERROR) |
| 593 |
{ |
{ |
| 599 |
} |
} |
| 600 |
else |
else |
| 601 |
{ |
{ |
| 602 |
TRACE1("***** ERROR: send(%d) *****\n", m_dwError); |
TRACE1("***** ERROR: send header(%d) *****\n", m_dwError); |
| 603 |
fResult = FALSE; |
fResult = FALSE; |
| 604 |
break; |
break; |
| 605 |
} |
} |
| 606 |
} |
} |
| 607 |
else |
else |
| 608 |
{ |
{ |
| 609 |
bufPtr += nRet; |
hdrPtr += nRet; |
| 610 |
sendSize -= nRet; |
hdrSize -= nRet; |
| 611 |
|
} |
| 612 |
|
} |
| 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 |
} |
} |
|
while (sendSize > 0); |
|
| 645 |
|
|
| 646 |
if ((lEvent != 0) && (lEvent & FD_WRITE)) |
if ((lEvent != 0) && (lEvent & FD_WRITE)) |
| 647 |
{ |
{ |
| 671 |
} |
} |
| 672 |
|
|
| 673 |
// Receive header |
// Receive header |
| 674 |
nRet = recv(hSocket, reinterpret_cast<LPSTR>(&header.size), sizeof(HEADER), MSG_PEEK); |
nRet = recv(hSocket, DATA_RECEIVE(&header), sizeof(HEADER), MSG_PEEK); |
| 675 |
|
|
| 676 |
if (nRet == sizeof(HEADER)) |
if (nRet == sizeof(HEADER)) |
| 677 |
{ |
{ |
| 686 |
do |
do |
| 687 |
{ |
{ |
| 688 |
// Receive data |
// Receive data |
| 689 |
nRet = recv(hSocket, reinterpret_cast<LPSTR>(data.GetData() + bufPtr), recvSize, 0); |
nRet = recv(hSocket, DATA_RECEIVE(data.GetData() + bufPtr), recvSize, 0); |
| 690 |
|
|
| 691 |
if (nRet == SOCKET_ERROR) |
if (nRet == SOCKET_ERROR) |
| 692 |
{ |
{ |
| 715 |
if (data.GetSize() >= sizeof(HEADER)) |
if (data.GetSize() >= sizeof(HEADER)) |
| 716 |
{ |
{ |
| 717 |
data.RemoveAt(0, sizeof(HEADER)); |
data.RemoveAt(0, sizeof(HEADER)); |
|
data.FreeExtra(); |
|
| 718 |
} |
} |
| 719 |
} |
} |
| 720 |
else |
else |