Files
2026-03-03 13:56:44 +08:00

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);
}