Files
wnmj/Servers/服务器组件/网络服务/ClientSocket.cpp

539 lines
13 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "Stdafx.h"
#include "ClientSocket.h"
//////////////////////////////////////////////////////////////////////////
//<2F><EFBFBD><EAB6A8>
#define ID_SOCKET_WND 10 //SOCKET <20><><EFBFBD><EFBFBD> ID
#define WM_SOCKET_NOTIFY WM_USER+10 //SOCKET <20><>Ϣ
//////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CClientSocket, CWnd)
ON_MESSAGE(WM_SOCKET_NOTIFY,OnSocketNotify)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CClientSocket::CClientSocket()
{
m_wRecvSize=0;
m_cbSendRound=0;
m_cbRecvRound=0;
m_dwSendXorKey=0;
m_dwRecvXorKey=0;
m_dwSendTickCount=0;
m_dwRecvTickCount=0;
m_dwSendPacketCount=0;
m_dwRecvPacketCount=0;
//m_cbSocketStatus=SHUT_REASON_NORMAL;
m_hSocket=INVALID_SOCKET;
m_pIClientSocketSink = NULL;
//m_ProxyInfo.wProxyPort=0;
//m_ProxyInfo.cbProxyType=PROXY_NONE;
m_cbSocketStatus=SOCKET_STATUS_IDLE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CClientSocket::~CClientSocket()
{
CloseSocket();
}
//<2F>ӿڲ<D3BF>ѯ
void * CClientSocket::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IClientSocket, Guid, dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IClientSocket, Guid, dwQueryVer);
return NULL;
}
//<2F><><EFBFBD>ýӿ<C3BD>
bool CClientSocket::SetTCPSocketSink(IUnknownEx * pIUnknownEx)
{
ASSERT(pIUnknownEx!=NULL);
m_pIClientSocketSink = (IClientSocketSink *)pIUnknownEx->QueryInterface(IID_IClientSocketSink, VER_IClientSocketSink);
ASSERT(m_pIClientSocketSink != NULL);
return (m_pIClientSocketSink != NULL);
}
//<2F><>ȡ<EFBFBD>ӿ<EFBFBD>
void * CClientSocket::GetTCPSocketSink(const IID & Guid, DWORD dwQueryVer)
{
if (m_pIClientSocketSink == NULL) return NULL;
return m_pIClientSocketSink->QueryInterface(Guid, dwQueryVer);
}
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
BYTE CClientSocket::Connect(DWORD dwServerIP, WORD wPort)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_hSocket==INVALID_SOCKET);
ASSERT(m_cbSocketStatus==SOCKET_STATUS_IDLE);
//Ч<><D0A7>״̬
if (m_hSocket!=INVALID_SOCKET) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SOCKET <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>");
if (m_cbSocketStatus!=SOCKET_STATUS_IDLE) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ǵȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬");
if (dwServerIP==INADDR_NONE) throw TEXT("Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<EFBFBD><EFBFBD>ԣ<EFBFBD>");
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
m_wRecvSize=0;
m_cbSendRound=0;
m_cbRecvRound=0;
m_dwSendXorKey=0x12345678;
m_dwRecvXorKey=0x12345678;
m_dwSendTickCount=GetTickCount()/1000L;
m_dwRecvTickCount=GetTickCount()/1000L;
try
{
//<2F><><EFBFBD><EFBFBD> SOCKET
m_hSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (m_hSocket==INVALID_SOCKET) throw TEXT("SOCKET <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
if ((m_hWnd==NULL)&&(!Create(NULL,NULL,WS_CHILD,CRect(0,0,0,0),GetDesktopWindow(),ID_SOCKET_WND,NULL)))
throw TEXT("SOCKET <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ʧ<EFBFBD><CAA7>");
//<2F><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
m_wSocketID=m_hSocket;
SOCKADDR_IN SocketAddr;
memset(&SocketAddr,0,sizeof(SocketAddr));
SocketAddr.sin_family=AF_INET;
SocketAddr.sin_port=htons(wPort);
SocketAddr.sin_addr.S_un.S_addr=dwServerIP;
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
int iErrorCode=0;
WSASetLastError(0);
//if (m_ProxyInfo.cbProxyType!=PROXY_NONE)
//{
// throw TEXT("δ֧<CEB4>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
//}
//else
{
//<2F>󶨴<EFBFBD><F3B6A8B4><EFBFBD>
iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_NOTIFY,FD_READ|FD_CONNECT|FD_CLOSE);
if (iErrorCode==SOCKET_ERROR) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>");
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
iErrorCode=connect(m_hSocket,(SOCKADDR *)&SocketAddr,sizeof(SocketAddr));
if (iErrorCode==SOCKET_ERROR)
{
iErrorCode=WSAGetLastError();
if (iErrorCode!=WSAEWOULDBLOCK)
{
static TCHAR szBuffer[64];
_sntprintf(szBuffer,sizeof(szBuffer),TEXT("<EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [ %d ]"),iErrorCode);
throw szBuffer;
}
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_cbSocketStatus=SOCKET_STATUS_WAIT;
}
return CONNECT_SUCCESS;
}
catch (LPCTSTR pszError)
{
CloseSocket();
throw pszError;
return CONNECT_FAILURE;
}
catch (...)
{
CloseSocket();
throw TEXT("<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return CONNECT_EXCEPTION;
}
}
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
BYTE CClientSocket::Connect(const LPCTSTR pszServerIP, WORD wPort)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wPort!=0);
ASSERT(pszServerIP!=NULL);
if ((pszServerIP==NULL)||(wPort==0)) return false;
return Connect(TranslateAddr(pszServerIP),wPort);
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
WORD CClientSocket::SendData(WORD wMainCmdID, WORD wSubCmdID)
{
//Ч<><D0A7>״̬
if (m_hSocket==INVALID_SOCKET) return false;
if (m_cbSocketStatus!=SOCKET_STATUS_CONNECT) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
TCP_Head * pHead=(TCP_Head *)cbDataBuffer;
pHead->CommandInfo.wMainCmdID=wMainCmdID;
pHead->CommandInfo.wSubCmdID=wSubCmdID;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head), sizeof(cbDataBuffer));
m_dwSendPacketCount++;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return (WORD)SendDataBuffer(cbDataBuffer,wSendSize);
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
WORD CClientSocket::SendData(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//Ч<><D0A7>״̬
if (m_hSocket==INVALID_SOCKET) return false;
if (m_cbSocketStatus!=SOCKET_STATUS_CONNECT) return false;
//Ч<><D0A7><EFBFBD><EFBFBD>С
ASSERT(wDataSize<=SOCKET_TCP_PACKET);
if (wDataSize>SOCKET_TCP_PACKET) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
TCP_Head * pHead=(TCP_Head *)cbDataBuffer;
pHead->CommandInfo.wMainCmdID=wMainCmdID;
pHead->CommandInfo.wSubCmdID=wSubCmdID;
if (wDataSize>0)
{
ASSERT(pData!=NULL);
CopyMemory(pHead+1,pData,wDataSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head) + wDataSize, sizeof(cbDataBuffer));
m_dwSendPacketCount++;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return (WORD)SendDataBuffer(cbDataBuffer, wSendSize);
}
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
void CClientSocket::CloseSocket()
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bool bClose=(m_hSocket!=INVALID_SOCKET);
m_cbSocketStatus=SOCKET_STATUS_IDLE;
if (m_hSocket!=INVALID_SOCKET)
{
WSAAsyncSelect(m_hSocket,GetSafeHwnd(),WM_SOCKET_NOTIFY,0);
closesocket(m_hSocket);
m_hSocket=INVALID_SOCKET;
m_cbSocketStatus=SOCKET_STATUS_IDLE;
}
if ((bClose == true) && (m_pIClientSocketSink != NULL))
{
ASSERT(m_pIClientSocketSink != NULL);
try { m_pIClientSocketSink->OnEventClientSocketShut(m_wSocketID, SHUT_REASON_NORMAL); }
catch (...) {}
}
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_wRecvSize=0;
m_cbSendRound=0;
m_cbRecvRound=0;
m_dwSendXorKey=0;
m_dwRecvXorKey=0;
m_dwSendTickCount=0;
m_dwRecvTickCount=0;
m_dwSendPacketCount=0;
m_dwRecvPacketCount=0;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD CClientSocket::SendDataBuffer(void * pBuffer, WORD wSendSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wSendSize!=0);
ASSERT(pBuffer!=NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSended=0;
while (wSended<wSendSize)
{
int iErrorCode=send(m_hSocket,(char *)pBuffer+wSended,wSendSize-wSended,0);
if (iErrorCode==SOCKET_ERROR)
{
if (WSAGetLastError()==WSAEWOULDBLOCK)
{
m_dwSendTickCount=GetTickCount()/1000L;
return true;
}
return false;
}
wSended+=iErrorCode;
}
m_dwSendTickCount=GetTickCount()/1000L;
return true;
}
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
DWORD CClientSocket::TranslateAddr(LPCTSTR pszServerAddr)
{
//ת<><D7AA><EFBFBD><EFBFBD>ַ
DWORD dwServerIP=inet_addr((LPCSTR)CT2A(pszServerAddr));
if (dwServerIP==INADDR_NONE)
{
LPHOSTENT lpHost=gethostbyname((LPCSTR)CT2A(pszServerAddr));
if (lpHost==NULL) return INADDR_NONE;
dwServerIP=((LPIN_ADDR)lpHost->h_addr)->s_addr;
}
return dwServerIP;
}
//<2F><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
/*LPCTSTR CClientSocket::GetConnectError(int iErrorCode, LPTSTR pszBuffer, WORD wBufferSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pszBuffer!=NULL);
if (pszBuffer==NULL) return NULL;
//<2F><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
switch (iErrorCode)
{
case 0: //û<>д<EFBFBD><D0B4><EFBFBD>
{
lstrcpyn(pszBuffer,TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<EFBFBD>"),wBufferSize);
break;
}
case WSAEADDRNOTAVAIL: //<2F><>ַ<EFBFBD><D6B7>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
{
lstrcpyn(pszBuffer,TEXT("Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<EFBFBD><EFBFBD>ԣ<EFBFBD>"),wBufferSize);
break;
}
case WSAECONNREFUSED: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
lstrcpyn(pszBuffer,TEXT("Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>æ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),wBufferSize);
break;
}
case WSAETIMEDOUT: //<2F><><EFBFBD>ӳ<EFBFBD>ʱ
{
lstrcpyn(pszBuffer,TEXT("<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD>߷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>"),wBufferSize);
break;
}
case WSAEHOSTUNREACH:
{
lstrcpyn(pszBuffer,TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Internet <20><>"),wBufferSize);
break;
}
default: //Ĭ<>ϴ<EFBFBD><CFB4><EFBFBD>
{
_snprintf(pszBuffer,wBufferSize,TEXT("<EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>%ld<6C><64><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲᣡ"),iErrorCode);
break;
}
}
return pszBuffer;
}*/
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LRESULT CClientSocket::OnSocketNotifyConnect(WPARAM wParam, LPARAM lParam)
{
//<2F>ж<EFBFBD>״̬
int iErrorCode=WSAGETSELECTERROR(lParam);
if (iErrorCode==0) m_cbSocketStatus=SOCKET_STATUS_CONNECT;
else CloseSocket();
//<2F><><EFBFBD><EFBFBD>֪ͨ
//TCHAR szErrorDesc[128]=TEXT("");
//GetConnectError(iErrorCode,szErrorDesc,sizeof(szErrorDesc));
m_pIClientSocketSink->OnEventClientSocketLink(m_wSocketID, iErrorCode);
return 1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
LRESULT CClientSocket::OnSocketNotifyRead(WPARAM wParam, LPARAM lParam)
{
try
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0);
if (iRetCode==SOCKET_ERROR) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹرգ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
ASSERT(m_dwSendPacketCount>0);
m_wRecvSize+=iRetCode;
m_dwRecvTickCount=GetTickCount()/1000L;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wPacketSize=0;
BYTE cbDataBuffer[SOCKET_TCP_PACKET+sizeof(TCP_Head)];
TCP_Head * pHead=(TCP_Head *)m_cbRecvBuf;
while (m_wRecvSize>=sizeof(TCP_Head))
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wPacketSize=pHead->TCPInfo.wPacketSize;
ASSERT(pHead->TCPInfo.cbDataKind == DK_MAPPED);
ASSERT(wPacketSize<=(SOCKET_TCP_PACKET+sizeof(TCP_Head)));
if (pHead->TCPInfo.cbDataKind != DK_MAPPED) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
if (wPacketSize>(SOCKET_TCP_PACKET+sizeof(TCP_Head))) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>̫<EFBFBD><EFBFBD>");
if (m_wRecvSize<wPacketSize) return 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwRecvPacketCount++;
CopyMemory(cbDataBuffer,m_cbRecvBuf,wPacketSize);
m_wRecvSize-=wPacketSize;
MoveMemory(m_cbRecvBuf,m_cbRecvBuf+wPacketSize,m_wRecvSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wRealySize = CrevasseBuffer(cbDataBuffer, wPacketSize);
ASSERT(wRealySize>=sizeof(TCP_Head));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wDataSize=wRealySize-sizeof(TCP_Head);
void * pDataBuffer=cbDataBuffer+sizeof(TCP_Head);
TCP_Command Command=((TCP_Head *)cbDataBuffer)->CommandInfo;
//<2F>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>
if (Command.wMainCmdID==MDM_KN_COMMAND)
{
switch (Command.wSubCmdID)
{
case SUB_KN_DETECT_SOCKET: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendData(MDM_KN_COMMAND,SUB_KN_DETECT_SOCKET,pDataBuffer,wDataSize);
break;
}
}
continue;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bSuccess = m_pIClientSocketSink->OnEventClientSocketRead(m_wSocketID, Command, pDataBuffer, wDataSize);
if (bSuccess==false) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
};
}
catch (...)
{
CloseSocket();
}
return 1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
LRESULT CClientSocket::OnSocketNotifyClose(WPARAM wParam, LPARAM lParam)
{
//m_cbSocketStatus=SHUT_REASON_NORMAL;
CloseSocket();
return 1;
}
//ӳ<><EFBFBD><E4B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE CClientSocket::MapSendByte(BYTE const cbData)
{
BYTE cbMap = g_SendByteMap[cbData];
return cbMap;
}
//ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE CClientSocket::MapRecvByte(BYTE const cbData)
{
BYTE cbMap = g_RecvByteMap[cbData];
return cbMap;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CClientSocket::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize)
{
int i = 0;
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wDataSize >= sizeof(TCP_Head));
ASSERT(wBufferSize >= (wDataSize + 2 * sizeof(DWORD)));
ASSERT(wDataSize <= (sizeof(TCP_Head) + SOCKET_TCP_BUFFER));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wEncryptSize = wDataSize - sizeof(TCP_Command), wSnapCount = 0;
if ((wEncryptSize % sizeof(DWORD)) != 0)
{
wSnapCount = sizeof(DWORD) - wEncryptSize % sizeof(DWORD);
memset(pcbDataBuffer + sizeof(TCP_Info) + wEncryptSize, 0, wSnapCount);
}
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
BYTE cbCheckCode = 0;
for (WORD i = sizeof(TCP_Info); i < wDataSize; i++)
{
cbCheckCode += pcbDataBuffer[i];
pcbDataBuffer[i] = MapSendByte(pcbDataBuffer[i]);
}
//<2F><>д<EFBFBD><D0B4>Ϣͷ
TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
pHead->TCPInfo.cbCheckCode = ~cbCheckCode + 1;
pHead->TCPInfo.wPacketSize = wDataSize;
pHead->TCPInfo.cbDataKind = DK_MAPPED;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwSendPacketCount++;
return wDataSize;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CClientSocket::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_dwSendPacketCount > 0);
ASSERT(wDataSize >= sizeof(TCP_Head));
ASSERT(((TCP_Head *)pcbDataBuffer)->TCPInfo.wPacketSize == wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSnapCount = 0;
if ((wDataSize % sizeof(DWORD)) != 0)
{
wSnapCount = sizeof(DWORD) - wDataSize % sizeof(DWORD);
memset(pcbDataBuffer + wDataSize, 0, wSnapCount);
}
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
BYTE cbCheckCode = pHead->TCPInfo.cbCheckCode;
for (int i = sizeof(TCP_Info); i < wDataSize; i++)
{
pcbDataBuffer[i] = MapRecvByte(pcbDataBuffer[i]);
cbCheckCode += pcbDataBuffer[i];
}
//if (cbCheckCode != 0)
//{
// ZASSERT_R(0);
// throw TEXT("<22><><EFBFBD>ݰ<EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
//}
return wDataSize;
}
//SOCKET <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LRESULT CClientSocket::OnSocketNotify(WPARAM wParam, LPARAM lParam)
{
switch (WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return OnSocketNotifyConnect(wParam,lParam);
}
case FD_READ: //<2F><><EFBFBD>ݶ<EFBFBD>ȡ
{
return OnSocketNotifyRead(wParam,lParam);
}
case FD_CLOSE: //<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
{
return OnSocketNotifyClose(wParam,lParam);
}
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DECLARE_CREATE_MODULE(ClientSocket)
//////////////////////////////////////////////////////////////////////////