CMNetwork/src/TCPAcceptPacket.cpp
2023-08-01 15:39:23 +08:00

105 lines
3.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<hgl/network/TCPAccept.h>
#include<hgl/network/SocketInputStream.h>
#include<hgl/network/SocketOutputStream.h>
#include<hgl/io/DataInputStream.h>
#include<hgl/io/DataOutputStream.h>
#include<hgl/type/StrChar.h>
namespace hgl
{
namespace network
{
TCPAcceptPacket::TCPAcceptPacket():TCPAccept(),recv_buffer(HGL_TCP_BUFFER_SIZE)
{
}
TCPAcceptPacket::TCPAcceptPacket(int s,IPAddress *ip):TCPAccept(s,ip),recv_buffer(HGL_TCP_BUFFER_SIZE)
{
}
/**
* 从socket接收数据回调函数<br>此写法有待改良
*/
int TCPAcceptPacket::OnSocketRecv(int /*size*/)
{
if(!sis)
{
sis=new SocketInputStream(ThisSocket);
recv_total=0;
recv_length=0;
}
int total=0;
while(true)
{
if(recv_length<PACKET_SIZE_TYPE_BYTES) //头都没收完
{
int result=sis->Read(recv_buffer.data()+recv_length,PACKET_SIZE_TYPE_BYTES-recv_length);
if(result<0)
return(result);
if(result==0)
return total;
recv_length+=result;
recv_total+=result;
total+=result;
}
if(recv_length<PACKET_SIZE_TYPE_BYTES) //已经有头了
continue;
PACKET_SIZE_TYPE pack_size=*(PACKET_SIZE_TYPE *)(recv_buffer.data());
recv_buffer.SetCount(PACKET_SIZE_TYPE_BYTES+pack_size);
int result=sis->Read(recv_buffer.data()+recv_length,pack_size-(recv_length-PACKET_SIZE_TYPE_BYTES));
if(result<0)
return(result);
if(result==0)
return total;
recv_length+=result;
recv_total+=result;
total+=result;
if(recv_length<pack_size+PACKET_SIZE_TYPE_BYTES) //这个包还没收完整
return(total); //证明socket缓冲区里没有数据了直接返回
OnRecvPacket(recv_buffer.data()+PACKET_SIZE_TYPE_BYTES,pack_size); //调用回调
recv_buffer.Clear();
recv_length=0;
}
}
bool TCPAcceptPacket::SendPacket(void *data,const PACKET_SIZE_TYPE &size)
{
if(!data)return(false);
if(size<=0)return(false);
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4
//直接发,,,,正式版 本当然不能这样写,,,但现在先这样了
if(!sos)
sos=new SocketOutputStream(ThisSocket);
int result=sos->WriteFully(&size,sizeof(PACKET_SIZE_TYPE));
if(result!=sizeof(PACKET_SIZE_TYPE))
return(false);
result=sos->WriteFully(data,size);
if(result!=size)
return(false);
return(true);
}
}//namespace network
}//namespace hgl