net_packet.cpp
来自「网络泡泡被.net管理」· C++ 代码 · 共 375 行
CPP
375 行
// NET_Packet.cpp: implementation of the NET_Packet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "net_lib.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
NET_Packet::NET_Packet(int data_size)
{
m_data = new char[data_size];
m_max_data_size = data_size;
m_cursor = m_data + PACKET_CONTENT_POS;
m_uid_sendto = 0;
m_datalen = 0;
setCmd(NLIBP_NULL);
memset(m_data, 0, sizeof(NET_PACKET_HEADER));
setVersion(VER_PACKET);
}
NET_Packet::~NET_Packet()
{
if(m_data)
{
delete[] m_data;
}
}
void NET_Packet::write8(uint8 b)
{
if (m_cursor <= m_data + m_max_data_size - sizeof(b))
{
*(uint8 *) m_cursor = b;
m_cursor += sizeof(b);
}
}
void NET_Packet::write16(uint16 w)
{
if (m_cursor <= m_data + m_max_data_size - sizeof(w))
{
*(uint16 *) m_cursor = htons(w);
m_cursor += sizeof(w);
}
}
void NET_Packet::write32(uint32 dw)
{
if (m_cursor <= m_data + m_max_data_size - sizeof(dw))
{
*(uint32 *) m_cursor = htonl(dw);
m_cursor += sizeof(dw);
}
}
void NET_Packet::writeString(const char *str)
{
uint16 len = strlen(str) + 1;
if (m_cursor <= m_data + m_max_data_size - sizeof(len) - len)
{
write16(len);
strcpy(m_cursor, str);
m_cursor += len;
}
}
void NET_Packet::writeData(void* pData, uint16 len)
{
if (m_cursor <= m_data + m_max_data_size - sizeof(len) - len)
{
write16(len);
memcpy(m_cursor, pData, len);
m_cursor += len;
}
}
uint8 NET_Packet::read8()
{
uint8 b = 0;
if (m_cursor <= m_data + m_datalen - sizeof(uint8))
{
b = *m_cursor;
m_cursor += sizeof(b);
}
return b;
}
uint16 NET_Packet::read16()
{
uint16 w = 0;
if (m_cursor <= m_data + m_datalen - sizeof(w))
{
w = ntohs(*(uint16 *) m_cursor);
m_cursor += sizeof(w);
}
return w;
}
uint32 NET_Packet::read32()
{
uint32 dw = 0;
if (m_cursor <= m_data + m_datalen - sizeof(dw))
{
dw = ntohl(*(uint32 *) m_cursor);
m_cursor += sizeof(uint32);
}
return dw;
}
const char *NET_Packet::readString()
{
const char *str = NULL;
uint16 len = read16();
if (m_cursor <= m_data + m_datalen - len && !m_cursor[len - 1])
{
str = m_cursor;
m_cursor += len;
}
return str;
}
void* NET_Packet::readData()
{
uint16 len = read16();
void* str = NULL;
if (m_cursor <= m_data + m_datalen - len)
{
str = m_cursor;
m_cursor += len;
}
return str;
}
_PACKET_DATA NET_Packet::readBinary()
{
_PACKET_DATA ret;
ret.data_len = read16();
if (m_cursor <= m_data + m_datalen - ret.data_len)
{
ret.ptr_data = m_cursor;
m_cursor += ret.data_len;
}
return ret;
}
void NET_Packet::begin()
{
m_cursor = m_data + PACKET_CONTENT_POS;
}
void NET_Packet::end()
{
if(getLen() < m_cursor-m_data)
{
*((uint16*)(m_data + sizeof(NET_PACKET_HEADER)))
= ((NET_PACKET_HEADER *) m_data)->len
= ntohs(m_cursor-m_data);
}
}
//void NET_Packet::decrypt(const char *key)
//{
// int n = m_datalen - sizeof(NET_PACKET_HEADER);
// if (n > 0) {
// setkey((char *) key);
//
// char *p = m_data + sizeof(NET_PACKET_HEADER);
// while (n > 0) {
// dedes(p);
// p += 8;
// n -= 8;
// }
// }
//}
//void UDP_Packet::setSendto(uint32 uid)
//{
// m_uid_session = uid;
//}
int NET_Packet::recv(SOCKET socket)
{
int len = ::recv(socket,
m_data + m_datalen,
m_max_data_size - m_datalen,
0
);
if (len > 0)
begin();
m_datalen += len;
return len;
}
int NET_Packet::recv_from(TCP_Session* pSession)
{
int len = ::recv(pSession->get_SOCKET(),
m_data + m_datalen,
m_max_data_size - m_datalen,
0
);
if (len > 0)
begin();
m_datalen += len;
return len;
}
int NET_Packet::send(SOCKET socket)
{
end();
return ::send(socket, m_data, m_cursor - m_data, 0);
}
int NET_Packet::send_to(TCP_Session* pSession)
{
setSID(pSession->getUID());
setUID(pSession->getUID_opposite());
end();
return ::send(pSession->get_SOCKET(), m_data, m_cursor - m_data, 0);
}
int NET_Packet::recv(UDP_Socket* ptr_socket)
{
if(NULL==ptr_socket)
return 0;
socklen_t len = sizeof(m_addr_in);
int rlen = recvfrom(ptr_socket->get_SOCKET(),
m_data + m_datalen,
m_max_data_size - m_datalen,
0,
(sockaddr *) &m_addr_in,
&len);
if (rlen > 0)
begin();
// if(getCmd()==0 && getUID()==0)
// {
// }
m_datalen += rlen;
return rlen;
}
int NET_Packet::send_to(UDP_Session *ptr_session)
{
if(NULL==ptr_session || ptr_session->get_UDP_Socket()<=0)
return 0;
setSID(ptr_session->getUID());
setUID(ptr_session->getUID_opposite());
end();
int nret = ::sendto(ptr_session->get_UDP_Socket()->get_SOCKET(),
m_data,
m_cursor - m_data,
0,
(sockaddr *) ptr_session->get_sockaddr_in(),
sizeof(sockaddr_in)
);
return nret;
}
int NET_Packet::send_to(uint32 uid, UDP_Socket *ptr_socket)
{
if(NULL==ptr_socket)
return 0;
UDP_Session* ptr_session = ptr_socket->get_UDP_Session(uid);
if(NULL==ptr_session)
return 0;
setSID(uid);
setUID(ptr_session->getUID_opposite());
end();
int nret = ::sendto(ptr_socket->get_SOCKET(),
m_data,
m_cursor - m_data,
0,
(sockaddr *) ptr_session->get_sockaddr_in(),
sizeof(sockaddr_in)
);
return nret;
}
int NET_Packet::send(UDP_Socket *ptr_socket)
{
if(NULL==ptr_socket)
return 0;
UDP_Session* ptr_session = ptr_socket->get_UDP_Session(getSID());
if(NULL==ptr_session)
return 0;
end();
int nret = ::sendto(ptr_socket->get_SOCKET(),
m_data,
m_cursor - m_data,
0,
(sockaddr *) ptr_session->get_sockaddr_in(),
sizeof(sockaddr_in)
);
return nret;
}
void NET_Packet::setSendto(uint32 uid)
{
m_uid_sendto = uid;
}
NET_Packet* NET_Packet::get_cling_packet()
{
if(m_datalen<=getLen() /*|| m_datalen + PACKET_CONTENT_POS >= m_max_data_size*/)
{
return NULL;
}
// NET_PACKET_HEADER* p_head = (NET_PACKET_HEADER*)(m_data + getLen());
// if(p_head->ver!=VER_PACKET
// || p_head->len<=0
// || p_head->len + getLen() >= m_max_data_size)
// {
// return NULL;
// }
int size_cling = m_datalen - getLen();
NET_Packet* pRet = new NET_Packet;
memcpy(pRet->m_data, (void*)(m_data + getLen()), size_cling);
pRet->m_datalen = size_cling;
return pRet;
}
bool NET_Packet::is_cling()
{
if(m_datalen>=sizeof(NET_PACKET_HEADER) && m_datalen>=getLen())
{
return true;
}
else
{
return false;
}
}
void NET_Packet::reset()
{
m_cursor = m_data + PACKET_CONTENT_POS;
m_uid_sendto = 0;
m_datalen = 0;
setCmd(NLIBP_NULL);
}
NET_Packet* NET_Packet::clone_packet()
{
int len = m_cursor - m_data;
if(len<=PACKET_CONTENT_POS)
return NULL;
NET_Packet* pPacket = new NET_Packet(len+1);
memcpy(pPacket->m_data, m_data, len);
pPacket->m_addr_in = m_addr_in;
pPacket->m_datalen = m_datalen;
pPacket->m_uid_sendto = m_uid_sendto;
pPacket->m_cursor = pPacket->m_data + len;
return pPacket;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?