CMNetwork/src/UdpSocket.cpp

168 lines
4.4 KiB
C++
Raw Normal View History

2023-07-15 00:46:34 +08:00
#include<hgl/log/LogInfo.h>
2022-05-25 19:03:06 +08:00
#include<hgl/network/UdpSocket.h>
#include<string.h>
#if HGL_OS != HGL_OS_Windows
#include<netinet/udp.h>
#endif//HGL_OS != HGL_OS_Windows
//--------------------------------------------------------------------------------------------------
namespace hgl
{
namespace network
{
/**
*
*/
UDPSocket::UDPSocket()
{
ThisSocket=-1;
bind_addr=nullptr;
tar_addr=nullptr;
}
/**
*
*/
UDPSocket::~UDPSocket()
{
CloseSocket();
SAFE_CLEAR(tar_addr);
SAFE_CLEAR(bind_addr);
}
/**
* UDP连接使IP地址和端口
* @param addr
* @return true
* @return false
*/
bool UDPSocket::Create(const IPAddress *addr)
{
if(!addr)RETURN_FALSE;
if(!addr->IsUDP())RETURN_FALSE;
if(!Socket::InitSocket(addr))
RETURN_FALSE;
bind_addr=addr->CreateCopy();
if(!bind_addr->Bind(ThisSocket))
{
hgl::CloseSocket(ThisSocket);
RETURN_FALSE;
}
SetBlock(false);
return(true);
}
// /**
// * 创建一个UDP连接
// */
// bool UDPSocket::Create(int family)
// {
// if(family!=AF_INET&&family!=AF_INET6)RETURN_FALSE;
//
// if((ThisSocket=socket(family,SOCK_DGRAM,IPPROTO_UDP))<0)
// {
// LOG_ERROR(U16_TEXT("创建Socket失败errno:")+UTF16String(GetLastSocketError()));
// RETURN_FALSE;
// }
//
// SetBlock(false);
// return(true);
// }
/**
*
* @param addr
* @return
*/
bool UDPSocket::SetSendAddr(const IPAddress *addr)
{
if(ThisSocket==-1)RETURN_FALSE;
SAFE_CLEAR(tar_addr);
tar_addr=addr->CreateCopy();
{
const int opt = tar_addr->IsBoradcast()?1:0;
if(setsockopt(ThisSocket, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt))==-1)
RETURN_FALSE;
}
return(true);
}
/**
*
* @param data
* @param size
* @return
*/
int UDPSocket::SendPacket(const void *data,int size)
{
#ifdef _DEBUG
if(ThisSocket==-1)
{
LOG_HINT(U16_TEXT("UDPSocket没有调用Create"));
return(-1);
}
#endif//
return(sendto(ThisSocket,(char *)data,size,0,tar_addr->GetSockAddr(),tar_addr->GetSockAddrInSize()));
}
/**
*
* @param addr
* @param data
* @param size
* @return
*/
int UDPSocket::SendPacket(IPAddress *addr,const void *data,int size)
{
#ifdef _DEBUG
if(ThisSocket==-1)
{
LOG_HINT(U16_TEXT("UDPSocket没有调用Create"));
return(-1);
}
#endif//
return(sendto(ThisSocket,(char *)data,size,0,addr->GetSockAddr(),addr->GetSockAddrInSize()));
}
/**
*
* @param buf
* @param size
* @param remote_addr
* @return
*/
int UDPSocket::RecvPacket(void *buf,int size,IPAddress *remote_addr)
{
#ifdef _DEBUG
if(ThisSocket==-1)
{
LOG_HINT(U16_TEXT("UDPSocket没有调用Create"));
return(-1);
}
#endif//
static
#if HGL_OS == HGL_OS_Windows
int
#else
socklen_t
#endif//
sas=remote_addr->GetSockAddrInSize();
return(recvfrom(ThisSocket,(char *)buf,size,0,remote_addr->GetSockAddr(),&sas));
}
}//namespace network
}//namespace hgl