//============================================================================= int XSocket::_iSend(char * cData, int iSize, BOOL bSaveFlag) { int iOutLen, iRet, WSAErr; PutLogList("_iSend"); if (m_pUnsentDataList[m_sHead] != NULL) { if (bSaveFlag == TRUE) { iRet = _iRegisterUnsentData(cData, iSize); switch (iRet) { case -1: return XSOCKEVENT_CRITICALERROR; case 0: return XSOCKEVENT_QUENEFULL; case 1: break; } return XSOCKEVENT_BLOCK; } else return 0; } iOutLen = 0; while (iOutLen < iSize) { iRet = send(m_Sock, (cData + iOutLen), iSize - iOutLen, 0); if (iRet == SOCKET_ERROR) { WSAErr = WSAGetLastError(); if (WSAErr != WSAEWOULDBLOCK) { m_WSAErr = WSAErr; return XSOCKEVENT_SOCKETERROR; } else { if (bSaveFlag == TRUE) { iRet = _iRegisterUnsentData((cData + iOutLen), (iSize - iOutLen)); switch (iRet) { case -1: return XSOCKEVENT_CRITICALERROR; break; case 0: return XSOCKEVENT_QUENEFULL; break; case 1: break; } } return XSOCKEVENT_BLOCK; } } else iOutLen += iRet; } return iOutLen; }
int XSocket::iSendMsg(char * Data, DWORD dwSize, char cKey) { WORD * wp; int i, iRet; if (dwSize > m_dwBufferSize) return XSOCKEVENT_MSGSIZETOOLARGE; if (m_cType != XSOCK_NORMALSOCK) return XSOCKEVENT_SOCKETMISMATCH; if (m_cType == NULL) return XSOCKEVENT_NOTINITIALIZED; m_pSndBuffer[0] = cKey; wp = (WORD *)(m_pSndBuffer + 1); *wp = (WORD)(dwSize + 3); memcpy((char *)(m_pSndBuffer + 3), Data, dwSize); if (cKey != NULL) { for (i = 0; i < (int)(dwSize); i++) { m_pSndBuffer[3+i] += (i ^ cKey); m_pSndBuffer[3+i] = (char)( m_pSndBuffer[3+i] ^ (cKey ^ (dwSize - i)) ); } } if (m_bIsWriteEnabled == FALSE) { iRet = _iRegisterUnsentData(m_pSndBuffer, dwSize +3); } else iRet = _iSend(m_pSndBuffer, dwSize + 3, TRUE); if (iRet < 0) return iRet; else return (iRet - 3); }