728 lines
18 KiB
C++
728 lines
18 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "TraceService.h"
|
|||
|
|
#include "TCPSocketService.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(CTCPSocketService, CWnd)
|
|||
|
|
ON_MESSAGE(WM_SOCKET_NOTIFY, OnSocketNotify)
|
|||
|
|
END_MESSAGE_MAP()
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CTCPSocketService::CTCPSocketService(void)
|
|||
|
|
{
|
|||
|
|
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_cbSendRound = 0;
|
|||
|
|
m_cbRecvRound = 0;
|
|||
|
|
m_dwSendXorKey = 0;
|
|||
|
|
m_dwRecvXorKey = 0;
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
m_dwSendTickCount = 0;
|
|||
|
|
m_dwRecvTickCount = 0;
|
|||
|
|
m_dwSendPacketCount = 0;
|
|||
|
|
m_dwRecvPacketCount = 0;
|
|||
|
|
m_wServiceID = 0;
|
|||
|
|
m_cbSocketStatus = SOCKET_STATUS_IDLE;
|
|||
|
|
m_wRecvSize = 0;
|
|||
|
|
m_dwServerIP = INADDR_NONE;
|
|||
|
|
m_wPort = 0;
|
|||
|
|
m_bSuccess = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CTCPSocketService::~CTCPSocketService(void)
|
|||
|
|
{
|
|||
|
|
if (m_bService)
|
|||
|
|
ConcludeService();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F>ӿڲ<D3BF>ѯ
|
|||
|
|
void * CTCPSocketService::QueryInterface(const IID & Guid, DWORD dwQueryVer)
|
|||
|
|
{
|
|||
|
|
QUERYINTERFACE(ITCPSocketService, Guid, dwQueryVer);
|
|||
|
|
QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
|
|||
|
|
QUERYINTERFACE_IUNKNOWNEX(ITCPSocketService, Guid, dwQueryVer);
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CTCPSocketService::StartService()
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7>״̬
|
|||
|
|
if (m_bService == true)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(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>"), TraceLevel_Warning);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><EFBFBD><F3B6A8B6><EFBFBD>
|
|||
|
|
if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>봥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Exception);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//<2F><EFBFBD><F3B6A8B6><EFBFBD>
|
|||
|
|
if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>봥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Exception);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|||
|
|
// if (m_hSocket == INVALID_SOCKET) return false;
|
|||
|
|
if ((m_hWnd == NULL) && (!Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), GetDesktopWindow(), ID_SOCKET_WND, NULL)))
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
if (m_QueueService.StartService())
|
|||
|
|
{
|
|||
|
|
m_bService = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (LPCTSTR pszError)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(pszError, TraceLevel_Exception);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return m_bService;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
bool CTCPSocketService::ConcludeService()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_bService = false;
|
|||
|
|
|
|||
|
|
if (m_hSocket != INVALID_SOCKET)
|
|||
|
|
{
|
|||
|
|
closesocket(m_hSocket);
|
|||
|
|
WSAAsyncSelect(m_hSocket, GetSafeHwnd(), WM_SOCKET_NOTIFY, 0);
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_cbSendRound = 0;
|
|||
|
|
m_cbRecvRound = 0;
|
|||
|
|
m_dwSendXorKey = 0;
|
|||
|
|
m_dwRecvXorKey = 0;
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
m_dwSendTickCount = 0;
|
|||
|
|
m_dwRecvTickCount = 0;
|
|||
|
|
m_dwSendPacketCount = 0;
|
|||
|
|
m_dwRecvPacketCount = 0;
|
|||
|
|
m_cbSocketStatus = SOCKET_STATUS_IDLE;
|
|||
|
|
m_wRecvSize = 0;
|
|||
|
|
m_dwServerIP = INADDR_NONE;
|
|||
|
|
m_wPort = 0;
|
|||
|
|
m_bSuccess = false;
|
|||
|
|
|
|||
|
|
m_QueueServiceEvent.SetQueueServiceSink(NULL);
|
|||
|
|
|
|||
|
|
m_QueueService.ConcludeService();
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ýӿ<C3BD>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
|
|||
|
|
bool CTCPSocketService::SetServiceID(WORD wServiceID)
|
|||
|
|
{
|
|||
|
|
m_wServiceID = wServiceID;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ýӿ<C3BD>
|
|||
|
|
bool CTCPSocketService::SetTCPSocketEvent(IUnknownEx * pIUnknownEx)
|
|||
|
|
{
|
|||
|
|
//״̬<D7B4>ж<EFBFBD>
|
|||
|
|
if (m_bService == true)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(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>"), TraceLevel_Warning);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ýӿ<C3BD>
|
|||
|
|
if (m_QueueServiceEvent.SetQueueServiceSink(pIUnknownEx) == false)
|
|||
|
|
{
|
|||
|
|
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>봥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Warning);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ܽӿ<DCBD>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CTCPSocketService::CloseSocket()
|
|||
|
|
{
|
|||
|
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool bClose = (m_hSocket != INVALID_SOCKET);
|
|||
|
|
if (bClose)
|
|||
|
|
return m_QueueService.AddToQueue(QUEUE_SAFE_CLOSE, NULL, 0);
|
|||
|
|
|
|||
|
|
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_cbSendRound = 0;
|
|||
|
|
m_cbRecvRound = 0;
|
|||
|
|
m_dwSendXorKey = 0;
|
|||
|
|
m_dwRecvXorKey = 0;
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
m_dwSendTickCount = 0;
|
|||
|
|
m_dwRecvTickCount = 0;
|
|||
|
|
m_dwSendPacketCount = 0;
|
|||
|
|
m_dwRecvPacketCount = 0;
|
|||
|
|
m_cbSocketStatus = SOCKET_STATUS_IDLE;
|
|||
|
|
m_wRecvSize = 0;
|
|||
|
|
m_dwServerIP = INADDR_NONE;
|
|||
|
|
m_wPort = 0;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ӵ<EFBFBD>ַ
|
|||
|
|
bool CTCPSocketService::Connect(DWORD dwServerIP, WORD wPort)
|
|||
|
|
{
|
|||
|
|
if (m_bSuccess && ntohl(dwServerIP) == m_dwTempServerIP)//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUG --
|
|||
|
|
m_dwServerIP = ntohl(dwServerIP);
|
|||
|
|
else m_dwServerIP = dwServerIP;
|
|||
|
|
|
|||
|
|
m_wPort = wPort;
|
|||
|
|
m_dwTempServerIP = m_dwServerIP;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|||
|
|
m_cbSendRound = 0;
|
|||
|
|
m_cbRecvRound = 0;
|
|||
|
|
m_dwSendXorKey = 0x12345678;
|
|||
|
|
m_dwRecvXorKey = 0x12345678;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
return m_QueueService.AddToQueue(QUEUE_CONNECT_REQUEST, NULL, 0);
|
|||
|
|
}
|
|||
|
|
catch (LPCTSTR pszError)
|
|||
|
|
{
|
|||
|
|
CloseSocket(SHUT_REASON_EXCEPTION);
|
|||
|
|
throw pszError;
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
CloseSocket(SHUT_REASON_EXCEPTION);
|
|||
|
|
throw TEXT("<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>δ֪<EFBFBD>쳣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ӵ<EFBFBD>ַ
|
|||
|
|
bool CTCPSocketService::Connect(LPCTSTR szServerIP, WORD wPort)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(wPort != 0);
|
|||
|
|
ASSERT(szServerIP != NULL);
|
|||
|
|
if ((szServerIP == NULL) || (wPort == 0)) return false;
|
|||
|
|
return Connect(TranslateAddr(szServerIP), wPort);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
|
|||
|
|
bool CTCPSocketService::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));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return SendDataBuffer(cbDataBuffer, wSendSize);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//֪ͨ<CDA8>ص<EFBFBD>
|
|||
|
|
void CTCPSocketService::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
|
|||
|
|
{
|
|||
|
|
switch (wIdentifier)
|
|||
|
|
{
|
|||
|
|
case QUEUE_SEND_REQUEST:
|
|||
|
|
{
|
|||
|
|
ASSERT(pBuffer);
|
|||
|
|
ASSERT(wDataSize > 0);
|
|||
|
|
if (!pBuffer || wDataSize <= 0) return;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
WORD wSended = 0;
|
|||
|
|
while (wSended < wDataSize)
|
|||
|
|
{
|
|||
|
|
int iErrorCode = send(m_hSocket, (char *)pBuffer + wSended, wDataSize - wSended, 0);
|
|||
|
|
if (iErrorCode == SOCKET_ERROR)
|
|||
|
|
{
|
|||
|
|
if (WSAGetLastError() == WSAEWOULDBLOCK)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
wSended += iErrorCode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case QUEUE_CONNECT_REQUEST:
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7>״̬
|
|||
|
|
if (m_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>");
|
|||
|
|
if (m_wPort == 0) 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> SOCKET
|
|||
|
|
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|||
|
|
if (m_hSocket == INVALID_SOCKET) throw TEXT("SOCKET <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
|
|||
|
|
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(m_hSocket != INVALID_SOCKET);
|
|||
|
|
ASSERT(m_cbSocketStatus == SOCKET_STATUS_IDLE);
|
|||
|
|
|
|||
|
|
int 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><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
SOCKADDR_IN SocketAddr;
|
|||
|
|
memset(&SocketAddr, 0, sizeof(SocketAddr));
|
|||
|
|
SocketAddr.sin_family = AF_INET;
|
|||
|
|
SocketAddr.sin_port = htons(m_wPort);
|
|||
|
|
SocketAddr.sin_addr.S_un.S_addr = m_dwServerIP;
|
|||
|
|
|
|||
|
|
iErrorCode = connect(m_hSocket, (sockaddr*) & SocketAddr, sizeof(sockaddr));
|
|||
|
|
if (SOCKET_ERROR == iErrorCode)
|
|||
|
|
iErrorCode = WSAGetLastError();
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case QUEUE_SAFE_CLOSE:
|
|||
|
|
{
|
|||
|
|
if (m_hSocket != INVALID_SOCKET)
|
|||
|
|
{
|
|||
|
|
closesocket(m_hSocket);
|
|||
|
|
WSAAsyncSelect(m_hSocket, GetSafeHwnd(), WM_SOCKET_NOTIFY, 0);
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_cbSendRound = 0;
|
|||
|
|
m_cbRecvRound = 0;
|
|||
|
|
m_dwSendXorKey = 0;
|
|||
|
|
m_dwRecvXorKey = 0;
|
|||
|
|
m_hSocket = INVALID_SOCKET;
|
|||
|
|
m_dwSendTickCount = 0;
|
|||
|
|
m_dwRecvTickCount = 0;
|
|||
|
|
m_dwSendPacketCount = 0;
|
|||
|
|
m_dwRecvPacketCount = 0;
|
|||
|
|
m_cbSocketStatus = SOCKET_STATUS_IDLE;
|
|||
|
|
m_wRecvSize = 0;
|
|||
|
|
m_dwServerIP = INADDR_NONE;
|
|||
|
|
m_wPort = 0;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case QUEUE_DETECT_SOCKET:
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
ASSERT(FALSE);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
|
|||
|
|
bool CTCPSocketService::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_BUFFER);
|
|||
|
|
if (wDataSize > SOCKET_TCP_BUFFER) 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));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return SendDataBuffer(cbDataBuffer, wSendSize);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CTCPSocketService::SendDataBuffer(void * pBuffer, WORD wSendSize)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(wSendSize != 0);
|
|||
|
|
ASSERT(pBuffer != NULL);
|
|||
|
|
if (NULL == pBuffer || 0 == wSendSize) return false;
|
|||
|
|
|
|||
|
|
return m_QueueService.AddToQueue(QUEUE_SEND_REQUEST, pBuffer, wSendSize);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
VOID CTCPSocketService::CloseSocket(BYTE cbShutReason)
|
|||
|
|
{
|
|||
|
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_QueueServiceEvent.PostTCPSocketShutEvent(m_wServiceID, cbShutReason);
|
|||
|
|
CloseSocket();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
DWORD CTCPSocketService::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><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
WORD CTCPSocketService::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.cbVersion = SOCKET_TCP_VER;
|
|||
|
|
pHead->TCPInfo.cbDataKind = DK_MAPPED;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
|
|||
|
|
//DWORD dwXorKey = m_dwSendXorKey;
|
|||
|
|
//if (m_dwSendPacketCount == 0)
|
|||
|
|
//{
|
|||
|
|
// //<2F><><EFBFBD>ɵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// GUID Guid;
|
|||
|
|
// CoCreateGuid(&Guid);
|
|||
|
|
// dwXorKey = GetTickCount() * GetTickCount();
|
|||
|
|
// dwXorKey ^= Guid.Data1;
|
|||
|
|
// dwXorKey ^= Guid.Data2;
|
|||
|
|
// dwXorKey ^= Guid.Data3;
|
|||
|
|
// dwXorKey ^= *((DWORD *)Guid.Data4);
|
|||
|
|
|
|||
|
|
// //<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// dwXorKey = SeedRandMap((WORD)dwXorKey);
|
|||
|
|
// dwXorKey |= ((DWORD)SeedRandMap((WORD)(dwXorKey >> 16))) << 16;
|
|||
|
|
// dwXorKey ^= g_dwPacketKey;
|
|||
|
|
// m_dwSendXorKey = dwXorKey;
|
|||
|
|
// m_dwRecvXorKey = dwXorKey;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//WORD * pwSeed = (WORD *)(pcbDataBuffer + sizeof(TCP_Info));
|
|||
|
|
//DWORD * pdwXor = (DWORD *)(pcbDataBuffer + sizeof(TCP_Info));
|
|||
|
|
//WORD wEncrypCount = (wEncryptSize + wSnapCount) / sizeof(DWORD);
|
|||
|
|
//for (WORD i = 0; i < wEncrypCount; i++)
|
|||
|
|
//{
|
|||
|
|
// *pdwXor++ ^= dwXorKey;
|
|||
|
|
// dwXorKey = SeedRandMap(*pwSeed++);
|
|||
|
|
// dwXorKey |= ((DWORD)SeedRandMap(*pwSeed++)) << 16;
|
|||
|
|
// dwXorKey ^= g_dwPacketKey;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
|
|||
|
|
//if (m_dwSendPacketCount == 0)
|
|||
|
|
//{
|
|||
|
|
// MoveMemory(pcbDataBuffer + sizeof(TCP_Head) + sizeof(DWORD), pcbDataBuffer + sizeof(TCP_Head), wDataSize);
|
|||
|
|
// *((DWORD *)(pcbDataBuffer + sizeof(TCP_Head))) = m_dwSendXorKey;
|
|||
|
|
// pHead->TCPInfo.wPacketSize += sizeof(DWORD);
|
|||
|
|
// wDataSize += sizeof(DWORD);
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_dwSendPacketCount++;
|
|||
|
|
//m_dwSendXorKey = dwXorKey;
|
|||
|
|
|
|||
|
|
return wDataSize;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
WORD CTCPSocketService::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);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/*DWORD dwXorKey = m_dwRecvXorKey;
|
|||
|
|
DWORD * pdwXor = (DWORD *)(pcbDataBuffer + sizeof(TCP_Info));
|
|||
|
|
WORD * pwSeed = (WORD *)(pcbDataBuffer + sizeof(TCP_Info));
|
|||
|
|
WORD wEncrypCount = (wDataSize + wSnapCount - sizeof(TCP_Info)) / 4;
|
|||
|
|
for (WORD i = 0; i < wEncrypCount; i++)
|
|||
|
|
{
|
|||
|
|
if ((i == (wEncrypCount - 1)) && (wSnapCount > 0))
|
|||
|
|
{
|
|||
|
|
BYTE * pcbKey = ((BYTE *) & m_dwRecvXorKey) + sizeof(DWORD) - wSnapCount;
|
|||
|
|
CopyMemory(pcbDataBuffer + wDataSize, pcbKey, wSnapCount);
|
|||
|
|
}
|
|||
|
|
dwXorKey = SeedRandMap(*pwSeed++);
|
|||
|
|
dwXorKey |= ((DWORD)SeedRandMap(*pwSeed++)) << 16;
|
|||
|
|
dwXorKey ^= g_dwPacketKey;
|
|||
|
|
*pdwXor++ ^= m_dwRecvXorKey;
|
|||
|
|
m_dwRecvXorKey = dwXorKey;
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
//Ч<><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) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
|
|||
|
|
return wDataSize;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
|
|||
|
|
WORD CTCPSocketService::SeedRandMap(WORD wSeed)
|
|||
|
|
{
|
|||
|
|
DWORD dwHold = wSeed;
|
|||
|
|
return (WORD)((dwHold = dwHold * 241103L + 2533101L) >> 16);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ӳ<>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CTCPSocketService::MapSendByte(BYTE const cbData)
|
|||
|
|
{
|
|||
|
|
/*BYTE cbMap = g_SendByteMap[(BYTE)(cbData+m_cbSendRound)];
|
|||
|
|
m_cbSendRound += 3;*/
|
|||
|
|
BYTE cbMap = g_SendByteMap[(BYTE)(cbData)];
|
|||
|
|
return cbMap;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CTCPSocketService::MapRecvByte(BYTE const cbData)
|
|||
|
|
{
|
|||
|
|
//BYTE cbMap = g_RecvByteMap[cbData] - m_cbRecvRound;
|
|||
|
|
//m_cbRecvRound += 3;
|
|||
|
|
BYTE cbMap = g_RecvByteMap[cbData];
|
|||
|
|
return cbMap;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
LRESULT CTCPSocketService::OnSocketNotifyConnect(WPARAM wParam, LPARAM lParam)
|
|||
|
|
{
|
|||
|
|
//<2F>ж<EFBFBD>״̬
|
|||
|
|
int iErrorCode = WSAGETSELECTERROR(lParam);
|
|||
|
|
if (iErrorCode == 0)
|
|||
|
|
{
|
|||
|
|
m_cbSocketStatus = SOCKET_STATUS_CONNECT;
|
|||
|
|
m_bSuccess = true;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>֪ͨ
|
|||
|
|
m_QueueServiceEvent.PostTCPSocketLinkEvent(m_wServiceID, iErrorCode);
|
|||
|
|
}
|
|||
|
|
else CloseSocket(SHUT_REASON_TIME_OUT);
|
|||
|
|
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|||
|
|
LRESULT CTCPSocketService::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_BUFFER+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(pHead->TCPInfo.cbVersion == SOCKET_TCP_VER);
|
|||
|
|
ASSERT(wPacketSize <= (SOCKET_TCP_BUFFER + sizeof(TCP_Head)));
|
|||
|
|
//if (pHead->TCPInfo.cbVersion != SOCKET_TCP_VER) throw TEXT("<22><><EFBFBD>ݰ<EFBFBD><DDB0>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD>");
|
|||
|
|
if (pHead->TCPInfo.cbDataKind != DK_MAPPED) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD>汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
if (wPacketSize > (SOCKET_TCP_BUFFER + 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_QueueServiceEvent.PostTCPSocketReadEvent(m_wServiceID, Command, pDataBuffer, wDataSize);
|
|||
|
|
if ( !bSuccess )
|
|||
|
|
{
|
|||
|
|
CString strTmp;
|
|||
|
|
strTmp.Format(_T("MainID: %d SubID: %d DataSize: %d"), Command.wMainCmdID, Command.wSubCmdID, wDataSize);
|
|||
|
|
TRACE(strTmp);
|
|||
|
|
throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch ( TCHAR *e )
|
|||
|
|
{
|
|||
|
|
TRACE(e);
|
|||
|
|
CloseSocket(SHUT_REASON_EXCEPTION);
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
TRACE(_T("δ֪<EFBFBD>쳣"));
|
|||
|
|
CloseSocket(SHUT_REASON_EXCEPTION);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
|
|||
|
|
LRESULT CTCPSocketService::OnSocketNotifyClose(WPARAM wParam, LPARAM lParam)
|
|||
|
|
{
|
|||
|
|
CloseSocket(SHUT_REASON_REMOTE);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//SOCKET <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
LRESULT CTCPSocketService::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>
|
|||
|
|
extern "C" __declspec(dllexport) void * CreateTCPSocketService(const GUID & Guid, DWORD dwInterfaceVer)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CTCPSocketService * pTCPSocketService = NULL;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
pTCPSocketService = new CTCPSocketService();
|
|||
|
|
if (pTCPSocketService == NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
|
|||
|
|
void * pObject = pTCPSocketService->QueryInterface(Guid, dwInterfaceVer);
|
|||
|
|
if (pObject == NULL) throw TEXT("<EFBFBD>ӿڲ<EFBFBD>ѯʧ<EFBFBD><EFBFBD>");
|
|||
|
|
return pObject;
|
|||
|
|
}
|
|||
|
|
catch (...) {}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SafeDelete(pTCPSocketService);
|
|||
|
|
return NULL;
|
|||
|
|
}
|