📄 xsocket.cpp
字号:
// XSocket.cpp: implementation of the XSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "XSocket.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
XSocket::XSocket(HWND hWnd, int iBlockLimit)
{
register int i;
m_cType = NULL;
m_pRcvBuffer = NULL;
m_pSndBuffer = NULL;
m_Sock = INVALID_SOCKET;
m_dwBufferSize = 0;
m_cStatus = DEF_XSOCKSTATUS_READINGHEADER;
m_dwReadSize = 3;
m_dwTotalReadSize = 0;
for (i = 0; i < DEF_XSOCKBLOCKLIMIT; i++) {
m_iUnsentDataSize[i] = 0;
m_pUnsentDataList[i] = NULL;
}
m_sHead = 0;
m_sTail = 0;
m_WSAErr = NULL;
m_hWnd = hWnd;
m_bIsAvailable = FALSE;
m_bIsWriteEnabled = FALSE;
m_iBlockLimit = iBlockLimit;
}
XSocket::~XSocket()
{
register int i;
if (m_pRcvBuffer != NULL) delete[] m_pRcvBuffer;
if (m_pSndBuffer != NULL) delete[] m_pSndBuffer;
for (i = 0; i < DEF_XSOCKBLOCKLIMIT; i++)
if (m_pUnsentDataList[i] != NULL) delete[] m_pUnsentDataList[i];
// 家南阑 付历 佬绊 摧绰促.
_CloseConn();
}
BOOL XSocket::bInitBufferSize(DWORD dwBufferSize)
{
if (m_pRcvBuffer != NULL) delete[] m_pRcvBuffer;
if (m_pSndBuffer != NULL) delete[] m_pSndBuffer;
m_pRcvBuffer = new char[dwBufferSize+8];
if (m_pRcvBuffer == NULL) return FALSE;
m_pSndBuffer = new char[dwBufferSize+8];
if (m_pSndBuffer == NULL) return FALSE;
m_dwBufferSize = dwBufferSize;
return TRUE;
}
int XSocket::iOnSocketEvent(WPARAM wParam, LPARAM lParam)
{
int WSAEvent;
// 府胶醋 家南狼 捞亥飘绰 贸府且 荐 绝促.
if (m_cType != DEF_XSOCK_NORMALSOCK) return DEF_XSOCKEVENT_SOCKETMISMATCH;
// 檬扁拳 登瘤 臼酒辑 贸府且 荐 绝促.
if (m_cType == NULL) return DEF_XSOCKEVENT_NOTINITIALIZED;
if ((SOCKET)wParam != m_Sock) return DEF_XSOCKEVENT_SOCKETMISMATCH;
WSAEvent = WSAGETSELECTEVENT(lParam);
switch (WSAEvent) {
case FD_CONNECT:
if (WSAGETSELECTERROR(lParam) != 0) {
// 捞 家南狼 立加捞 角菩沁栏骨肺 犁立加阑 矫档茄促.
if (bConnect(m_pAddr, m_iPortNum, m_uiMsg) == FALSE) return DEF_XSOCKEVENT_SOCKETERROR;
return DEF_XSOCKEVENT_RETRYINGCONNECTION;
}
else {
m_bIsAvailable = TRUE;
return DEF_XSOCKEVENT_CONNECTIONESTABLISH;
}
break;
case FD_READ:
if (WSAGETSELECTERROR(lParam) != 0) {
// 佬绰 档吝 俊矾啊 惯积沁促.
m_WSAErr = WSAGETSELECTERROR(lParam);
return DEF_XSOCKEVENT_SOCKETERROR;
}
else return _iOnRead();
break;
case FD_WRITE:
m_bIsWriteEnabled = TRUE;
return _iSendUnsentData();
break;
case FD_CLOSE:
m_cType = DEF_XSOCK_SHUTDOWNEDSOCK; // 家南捞 摧躯栏骨肺 捞 家南篮 荤侩 阂啊瓷.
return DEF_XSOCKEVENT_SOCKETCLOSED;
break;
}
return DEF_XSOCKEVENT_UNKNOWN;
}
BOOL XSocket::bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg)
{
SOCKADDR_IN saTemp;
int iRet;
DWORD dwOpt;
struct hostent * hp;
// 府胶醋 家南栏肺 檬扁拳等 努贰胶绰 捞 窃荐甫 荤侩且 荐 绝促.
if (m_cType == DEF_XSOCK_LISTENSOCK) 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));
hp = gethostbyname(pAddr);
if (hp) {
memcpy(&(saTemp.sin_addr),hp->h_addr, hp->h_length);
saTemp.sin_family = hp->h_addrtype;
saTemp.sin_port = htons(iPort);
}
else {
return FALSE;
}
iRet = connect(m_Sock, (struct sockaddr *) &saTemp, sizeof(saTemp));
if (iRet == SOCKET_ERROR) {
if (WSAGetLastError() != WSAEWOULDBLOCK) {
m_WSAErr = WSAGetLastError();
return FALSE;
}
}
// 家南 可记阑 炼沥茄促.
dwOpt = 8192*5;
setsockopt(m_Sock, SOL_SOCKET, SO_RCVBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
setsockopt(m_Sock, SOL_SOCKET, SO_SNDBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
strcpy(m_pAddr, pAddr);
m_iPortNum = iPort;
m_uiMsg = uiMsg;
m_cType = DEF_XSOCK_NORMALSOCK;
return TRUE;
}
BOOL XSocket::bConnect(char * pAddr, int iPort, unsigned int uiMsg)
{
SOCKADDR_IN saTemp;
u_long arg;
int iRet;
DWORD dwOpt;
// 府胶醋 家南栏肺 檬扁拳等 努贰胶绰 捞 窃荐甫 荤侩且 荐 绝促.
if (m_cType == DEF_XSOCK_LISTENSOCK) 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;
// 家南阑 稠喉废欧 葛靛肺
arg = 1;
// 林家甫 官牢靛茄促.
memset(&saTemp,0,sizeof(saTemp));
saTemp.sin_family = AF_INET;
saTemp.sin_addr.s_addr = inet_addr(pAddr);
saTemp.sin_port = htons(iPort);
WSAAsyncSelect(m_Sock, m_hWnd, uiMsg, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE);
iRet = connect(m_Sock, (struct sockaddr *) &saTemp, sizeof(saTemp));
if (iRet == SOCKET_ERROR) {
if (WSAGetLastError() != WSAEWOULDBLOCK) {
m_WSAErr = WSAGetLastError();
return FALSE;
}
}
// 家南 可记阑 炼沥茄促.
dwOpt = 8192*5;
setsockopt(m_Sock, SOL_SOCKET, SO_RCVBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
setsockopt(m_Sock, SOL_SOCKET, SO_SNDBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
strcpy(m_pAddr, pAddr);
m_iPortNum = iPort;
m_uiMsg = uiMsg;
m_cType = DEF_XSOCK_NORMALSOCK;
return TRUE;
}
int XSocket::_iOnRead()
{
int iRet, WSAErr;
WORD * wp;
if (m_cStatus == DEF_XSOCKSTATUS_READINGHEADER) {
iRet = recv(m_Sock, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);
if (iRet == SOCKET_ERROR) {
WSAErr = WSAGetLastError();
if (WSAErr != WSAEWOULDBLOCK) {
m_WSAErr = WSAErr;
return DEF_XSOCKEVENT_SOCKETERROR;
}
else return DEF_XSOCKEVENT_BLOCK;
}
else
if (iRet == 0) {
// 家南捞 摧躯促.
m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
return DEF_XSOCKEVENT_SOCKETCLOSED;
}
m_dwReadSize -= iRet;
m_dwTotalReadSize += iRet;
if (m_dwReadSize == 0) {
// 庆歹甫 促 佬菌促.
m_cStatus = DEF_XSOCKSTATUS_READINGBODY;
// 佬绢具 且 个眉 荤捞令甫 拌魂茄促.
wp = (WORD *)(m_pRcvBuffer + 1);
m_dwReadSize = (int)(*wp - 3); // 庆歹 荤捞令绰 器窃窍瘤 臼绰促.
if (m_dwReadSize == 0) {
// 个眉 荤捞令啊 0捞搁 个眉何盒阑 佬阑 鞘夸啊 绝栏骨肺
m_cStatus = DEF_XSOCKSTATUS_READINGHEADER;
m_dwReadSize = 3;
m_dwTotalReadSize = 0;
return DEF_XSOCKEVENT_READCOMPLETE;
}
else
if (m_dwReadSize > m_dwBufferSize) {
m_cStatus = DEF_XSOCKSTATUS_READINGHEADER;
m_dwReadSize = 3;
m_dwTotalReadSize = 0;
return DEF_XSOCKEVENT_MSGSIZETOOLARGE;
}
}
return DEF_XSOCKEVENT_ONREAD;
}
else
if (m_cStatus == DEF_XSOCKSTATUS_READINGBODY) {
iRet = recv(m_Sock, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);
if (iRet == SOCKET_ERROR) {
WSAErr = WSAGetLastError();
if (WSAErr != WSAEWOULDBLOCK) {
m_WSAErr = WSAErr;
return DEF_XSOCKEVENT_SOCKETERROR;
}
else return DEF_XSOCKEVENT_BLOCK;
}
else
if (iRet == 0) {
// 家南捞 摧躯促.
m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
return DEF_XSOCKEVENT_SOCKETCLOSED;
}
m_dwReadSize -= iRet;
m_dwTotalReadSize += iRet;
if (m_dwReadSize == 0) {
// 个眉甫 促 佬菌促. 促澜锅 捞亥飘甫 困秦 惑怕甫 官槽促.
m_cStatus = DEF_XSOCKSTATUS_READINGHEADER;
m_dwReadSize = 3;
m_dwTotalReadSize = 0;
}
else return DEF_XSOCKEVENT_ONREAD;
}
// 皋矫瘤甫 葛滴 佬菌促. 捞 皋矫瘤甫 罐栏搁 努贰胶 滚欺狼 郴侩阑 佬绢 溜阿 贸府秦具 茄促.
return DEF_XSOCKEVENT_READCOMPLETE;
}
int XSocket::_iSend(char * cData, int iSize, BOOL bSaveFlag)
{
int iOutLen, iRet, WSAErr;
if (m_pUnsentDataList[m_sHead] != NULL) {
if (bSaveFlag == TRUE) {
// 父距 措扁凯俊 单捞磐啊 巢酒 乐绊 怖 焊郴具 窍绰 单捞磐扼搁
// 皋矫瘤狼 鉴辑甫 嘎眠扁 困秦 公炼扒 措扁凯俊 历厘秦具 茄促.
iRet = _iRegisterUnsentData(cData, iSize);
switch (iRet) {
case -1:
// 且寸且 皋葛府啊 绝促. 捞版快绰 汗备且 规过捞 绝促.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -