📄 xsocket.cpp
字号:
return DEF_XSOCKEVENT_CRITICALERROR;
case 0:
// 钮啊 啊垫谩促. 捞 家南 努贰胶绰 昏力登绢具父 茄促.
return DEF_XSOCKEVENT_QUENEFULL;
case 1:
// 沥惑利栏肺 单捞磐甫 殿废沁促.
break;
}
return DEF_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 DEF_XSOCKEVENT_SOCKETERROR;
}
else {
// 喉钒惑怕捞搁 歹捞惑 焊尘 荐 绝栏骨肺 巢酒乐绰 单捞磐甫 府胶飘俊 殿废窍绊 府畔
if (bSaveFlag == TRUE) {
iRet = _iRegisterUnsentData((cData + iOutLen), (iSize - iOutLen));
switch (iRet) {
case -1:
// 且寸且 皋葛府啊 绝促. 捞版快绰 汗备且 规过捞 绝促.
return DEF_XSOCKEVENT_CRITICALERROR;
break;
case 0:
// 钮啊 啊垫谩促. 捞 家南 努贰胶绰 昏力登绢具父 茄促.
return DEF_XSOCKEVENT_QUENEFULL;
break;
case 1:
// 沥惑利栏肺 单捞磐甫 殿废沁促.
break;
}
}
return DEF_XSOCKEVENT_BLOCK;
}
} else iOutLen += iRet;
}
return iOutLen;
}
// 捞 窃荐绰 _SendUnsentData俊辑父 荤侩茄促. 喉废捞 酒囱 俊矾矫俊绰 澜荐蔼阑, 喉钒惑怕甫 器窃茄 傈价惑怕俊辑绰 焊辰 父怒狼 蔼阑 馆券.
int XSocket::_iSend_ForInternalUse(char * cData, int iSize)
{
int iOutLen, iRet, WSAErr;
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 DEF_XSOCKEVENT_SOCKETERROR;
}
else {
// 喉钒惑怕捞搁 歹捞惑 焊尘 荐 绝栏骨肺 瘤陛鳖瘤 焊辰 单捞磐 荤捞令父阑 馆券
return iOutLen;
}
} else iOutLen += iRet;
}
return iOutLen;
}
int XSocket::_iRegisterUnsentData(char * cData, int iSize)
{
// 钮啊 啊垫瞒辑 歹捞惑 单捞磐甫 措扁凯俊 历厘且 荐 绝促.
if (m_pUnsentDataList[m_sTail] != NULL) return 0;
m_pUnsentDataList[m_sTail] = new char[iSize];
if (m_pUnsentDataList[m_sTail] == NULL) return -1; // 皋葛府 且寸俊 角菩沁促.
// 单捞磐 历厘
memcpy(m_pUnsentDataList[m_sTail], cData, iSize);
m_iUnsentDataSize[m_sTail] = iSize;
// 抛老 器牢磐 刘啊
m_sTail++;
//if (m_sTail >= DEF_XSOCKBLOCKLIMIT) m_sTail = 0;
if (m_sTail >= m_iBlockLimit) m_sTail = 0;
return 1;
}
int XSocket::_iSendUnsentData()
{
int iRet;
char * pTemp;
// 啊瓷茄 茄 措扁凯狼 单捞磐甫 焊辰促.
while (m_pUnsentDataList[m_sHead] != NULL) {
iRet = _iSend_ForInternalUse(m_pUnsentDataList[m_sHead], m_iUnsentDataSize[m_sHead]);
if (iRet == m_iUnsentDataSize[m_sHead]) {
// Head钮狼 单捞磐甫 促 焊陈促. 促澜 单捞磐甫 焊辰促.
delete[] m_pUnsentDataList[m_sHead];
m_pUnsentDataList[m_sHead] = NULL;
m_iUnsentDataSize[m_sHead] = 0;
// 庆靛 器牢磐 刘啊
m_sHead++;
//if (m_sHead >= DEF_XSOCKBLOCKLIMIT) m_sHead = 0;
if (m_sHead >= m_iBlockLimit) m_sHead = 0;
}
else {
// 焊郴带 吝 家南 俊矾啊 惯积窍搁 弊成 府畔茄促. (力芭登具父 茄促)
if (iRet < 0)
return iRet;
// 单捞磐甫 促 焊郴瘤 给窍绊 肚 喉废 惑怕啊 惯积沁促. 焊郴瘤 给茄 单捞磐父 巢败初绰促.
pTemp = new char[m_iUnsentDataSize[m_sHead] - iRet];
memcpy(pTemp, m_pUnsentDataList[m_sHead] + iRet, m_iUnsentDataSize[m_sHead] - iRet);
delete[] m_pUnsentDataList[m_sHead];
m_pUnsentDataList[m_sHead] = pTemp;
return DEF_XSOCKEVENT_UNSENTDATASENDBLOCK;
}
}
return DEF_XSOCKEVENT_UNSENTDATASENDCOMPLETE;
}
int XSocket::iSendMsg(char * cData, DWORD dwSize, char cKey)
{
WORD * wp;
int i, iRet;
// 皋矫瘤 农扁啊 滚欺焊促 农搁 焊尘 荐 绝促.
if (dwSize > m_dwBufferSize) return DEF_XSOCKEVENT_MSGSIZETOOLARGE;
// 府胶醋 家南 趣篮 摧腮 家南栏肺 皋矫瘤甫 焊尘 荐绰 绝促.
if (m_cType != DEF_XSOCK_NORMALSOCK) return DEF_XSOCKEVENT_SOCKETMISMATCH;
// 檬扁拳 登瘤 臼酒辑 皋矫瘤甫 焊尘 荐 绝促.
if (m_cType == NULL) return DEF_XSOCKEVENT_NOTINITIALIZED;
// 虐 涝仿
m_pSndBuffer[0] = cKey;
wp = (WORD *)(m_pSndBuffer + 1);
*wp = (WORD)(dwSize + 3);
memcpy((char *)(m_pSndBuffer + 3), cData, dwSize);
// v.14 : m_pSndBuffer +3 何磐 dwSize鳖瘤 cKey啊 0捞 酒聪扼搁 鞠龋拳茄促.
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)) );
}
}
// 2001-11-27老 荐沥凳
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);
}
BOOL XSocket::bListen(char * pAddr, int iPort, unsigned int uiMsg)
{
SOCKADDR_IN saTemp;
if (m_cType != NULL) return FALSE;
if (m_Sock != INVALID_SOCKET) closesocket(m_Sock);
// 家南阑 积己茄促.
m_Sock = socket(AF_INET, SOCK_STREAM, 0);
if (m_Sock == INVALID_SOCKET)
return FALSE;
// 林家甫 官牢靛茄促.
memset(&saTemp,0,sizeof(saTemp));
saTemp.sin_family = AF_INET;
saTemp.sin_addr.s_addr = inet_addr(pAddr);
saTemp.sin_port = htons(iPort);
if ( bind(m_Sock, (PSOCKADDR)&saTemp, sizeof(saTemp)) == SOCKET_ERROR) {
closesocket(m_Sock);
return FALSE;
}
if (listen(m_Sock, 5) == SOCKET_ERROR) {
closesocket(m_Sock);
return FALSE;
}
WSAAsyncSelect(m_Sock, m_hWnd, uiMsg, FD_ACCEPT);
m_uiMsg = uiMsg;
m_cType = DEF_XSOCK_LISTENSOCK;
return TRUE;
}
BOOL XSocket::bAccept(class XSocket * pXSock, unsigned int uiMsg)
{
SOCKET AcceptedSock;
sockaddr Addr;
register int iLength;
DWORD dwOpt;
if (m_cType != DEF_XSOCK_LISTENSOCK) return FALSE;
if (pXSock == NULL) return FALSE;
iLength = sizeof(Addr);
// 努扼捞攫飘狼 立加阑 罐绰促 .
AcceptedSock = accept(m_Sock, (struct sockaddr FAR *)&Addr,(int FAR *)&iLength);
if (AcceptedSock == INVALID_SOCKET)
return FALSE;
pXSock->m_Sock = AcceptedSock;
WSAAsyncSelect(pXSock->m_Sock, m_hWnd, uiMsg, FD_READ | FD_WRITE | FD_CLOSE);
// Accept等 家南篮 焊烹 家南栏肺 檬扁拳 等促.
pXSock->m_uiMsg = uiMsg;
pXSock->m_cType = DEF_XSOCK_NORMALSOCK;
// 家南 可记阑 炼沥茄促.
dwOpt = 8192*5;
setsockopt(pXSock->m_Sock, SOL_SOCKET, SO_RCVBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
setsockopt(pXSock->m_Sock, SOL_SOCKET, SO_SNDBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
return TRUE;
}
void XSocket::_CloseConn()
{
char cTmp[100];
BOOL bFlag = TRUE;
int iRet;
if (m_Sock == INVALID_SOCKET) return; // v1.4
shutdown(m_Sock, 0x01);
while (bFlag == TRUE) {
iRet = recv(m_Sock, cTmp, sizeof(cTmp), 0);
if (iRet == SOCKET_ERROR) bFlag = FALSE;
if (iRet == 0) bFlag = FALSE;
}
closesocket(m_Sock);
m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
}
char * XSocket::pGetRcvDataPointer(DWORD * pMsgSize, char * pKey)
{
WORD * wp;
DWORD dwSize;
register int i;
char cKey;
cKey = m_pRcvBuffer[0];
if (pKey != NULL) *pKey = cKey; // v1.4
wp = (WORD *)(m_pRcvBuffer + 1);
*pMsgSize = (*wp) - 3; // 庆歹农扁绰 力寇秦辑 馆券茄促.
dwSize = (*wp) - 3;
// v.14 : m_pSndBuffer +3 何磐 dwSize鳖瘤 cKey啊 0捞 酒聪扼搁 鞠龋拳甫 乾促.
if (cKey != NULL) {
for (i = 0; i < (int)(dwSize); i++) {
m_pRcvBuffer[3+i] = (char)( m_pRcvBuffer[3+i] ^ (cKey ^ (dwSize - i)) );
m_pRcvBuffer[3+i] -= (i ^ cKey);
}
}
return (m_pRcvBuffer + 3);
}
int XSocket::iGetPeerAddress(char * pAddrString)
{
SOCKADDR_IN sockaddr;
int iRet, iLen;
iLen = sizeof(sockaddr);
iRet = getpeername(m_Sock, (struct sockaddr *)&sockaddr, &iLen);
strcpy(pAddrString, (const char *)inet_ntoa(sockaddr.sin_addr));
return iRet;
}
int XSocket::iSendMsgBlockingMode(char *buf,int nbytes)
{
int nleft =0,nwriten = 0 ;
nleft = nbytes;
while (nleft > 0) {
nwriten = send(m_Sock,buf,nleft,0);
if (nwriten < 0){
return nwriten;
}
if (nwriten == 0) break;
nleft -= nwriten;
buf += nwriten ;
}
return (nbytes - nleft);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -