59 lines
1.2 KiB
C++
59 lines
1.2 KiB
C++
#include "StdAfx.h"
|
|
#include "TCPSocket.h"
|
|
|
|
CTCPSocket::CTCPSocket(WORD id, WORD socket, DWORD dwClientAddr, CIOCPServer* pIOCPServer)
|
|
{
|
|
m_wID = id;
|
|
m_hSocket = socket;
|
|
m_dwClientAddr = dwClientAddr;
|
|
m_pIOCPServer = pIOCPServer;
|
|
}
|
|
|
|
CTCPSocket::~CTCPSocket(void)
|
|
{
|
|
}
|
|
|
|
bool CTCPSocket::sendData(void* data, DWORD len)
|
|
{
|
|
if (m_hSocket == INVALID_SOCKET)
|
|
return false;
|
|
|
|
if (data == NULL || len == 0)
|
|
return false;
|
|
|
|
return m_pIOCPServer->SendData(m_wID, data, len);
|
|
}
|
|
|
|
bool CTCPSocket::processRecvData(void* data, DWORD len)
|
|
{
|
|
const int HEADER_SIZE = 2;
|
|
|
|
// 先压入数据
|
|
m_recvBuffer.write(data, len);
|
|
|
|
// 如果当前缓存大小小于2个字节
|
|
if (m_recvBuffer.size() < HEADER_SIZE)
|
|
return true;
|
|
|
|
// 判断前面两个字节(代表包长度)
|
|
WORD size = 0;
|
|
m_recvBuffer.get(&size, sizeof(size));
|
|
if (size < HEADER_SIZE || size > MAX_USER_PACK_SIZE) {
|
|
printf("用户封包超过最大限制,无法处理, id=%d\n", m_wID);
|
|
m_pIOCPServer->Disconnect(m_wID);
|
|
return false;
|
|
}
|
|
|
|
// 如果包数据不够,继续接收数据
|
|
if (size > m_recvBuffer.size()) {
|
|
return true;
|
|
}
|
|
|
|
// 根据长度取出数据
|
|
BYTE userPack[MAX_USER_PACK_SIZE];
|
|
m_recvBuffer.read(userPack, size);
|
|
|
|
// 把取出的数据交给消息处理器来处理
|
|
return processMessage(userPack, size);
|
|
}
|