Ejemplo n.º 1
0
//=============================================================================
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);
}