539 lines
13 KiB
C++
539 lines
13 KiB
C++
|
|
#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)
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|