CMNetwork/src/TCPClient.cpp

168 lines
4.6 KiB
C++
Raw Normal View History

2022-05-25 19:03:06 +08:00
#include<hgl/network/TCPClient.h>
2023-07-15 00:46:34 +08:00
#include<hgl/log/LogInfo.h>
2022-05-25 19:03:06 +08:00
#include<hgl/network/SocketInputStream.h>
#include<hgl/network/SocketOutputStream.h>
/*
线 线
线
线线线
*/
/*
线
线socket接收到暂存缓冲区
线
线
访
线socket接收缓冲区暴满
*/
namespace hgl
{
namespace network
{
void TCPClient::InitPrivate(int sock)
{
TimeOut=HGL_NETWORK_TIME_OUT;
sis=new SocketInputStream(sock);
sos=new SocketOutputStream(sock);
ipstr = nullptr;
}
/**
* TCP客户端连接类构造函数
*/
TCPClient::TCPClient():TCPSocket()
{
InitPrivate(-1);
}
TCPClient::TCPClient(int sock,const IPAddress *addr):TCPSocket(sock,addr)
{
InitPrivate(sock);
}
TCPClient::~TCPClient()
{
Disconnect();
SAFE_CLEAR(sis);
SAFE_CLEAR(sos);
SAFE_CLEAR_ARRAY(ipstr);
}
/**
*
* @return
*/
bool TCPClient::Connect()
{
if(ThisSocket<0||!ThisAddress)RETURN_FALSE;
if(connect(ThisSocket,ThisAddress->GetSockAddr(),ThisAddress->GetSockAddrInSize()))
{
SAFE_CLEAR(ipstr);
ipstr=ThisAddress->CreateString();
LOG_HINT(U8_TEXT("Don't Connect to TCPServer ")+UTF8String(ipstr));
this->CloseSocket();
return(false);
}
// LOG_INFO(u"connect "+u8_to_u16(host)+u':'+UTF16String(port)+u" ok,socket:"+UTF16String(ThisSocket));
SetBlock(true,TimeOut); //阻塞模式
ResetConnect();
return(true);
}
/**
*
* @param addr
*/
bool TCPClient::CreateConnect(const IPAddress *addr)
{
if(!addr)
RETURN_FALSE;
if(!addr->IsTCP())
RETURN_FALSE;
if(!InitSocket(addr))
RETURN_FALSE;
return this->Connect();
}
/**
*
*/
void TCPClient::Disconnect()
{
SAFE_CLEAR_ARRAY(ipstr);
if(ThisSocket==-1)
return;
this->CloseSocket(); //两个线程会自动因为socket关闭而退出
//注线程退出会调用ThreadExit再次调用Disconnect
}
/**
* 使socket
* @param sock socket编号
* @param addr socket地址
*/
bool TCPClient::UseSocket(int sock,const IPAddress *addr)
{
if(!TCPSocket::UseSocket(sock,addr))
RETURN_FALSE;
((SocketInputStream *)sis)->SetSocket(sock);
((SocketOutputStream *)sos)->SetSocket(sock);
return(true);
}
TCPClient *CreateTCPClient(IPAddress *addr)
{
if(!addr)RETURN_ERROR_NULL;
if(!addr->IsTCP())
RETURN_ERROR_NULL;
int sock=CreateSocket(addr);
if(sock<0)
RETURN_ERROR_NULL;
if(!Connect(sock,addr))
{
CloseSocket(sock);
RETURN_ERROR_NULL;
}
return(new TCPClient(sock,addr));
}
}//namespace network
}//namespace hgl