105 lines
3.8 KiB
C
105 lines
3.8 KiB
C
|
#ifndef HGL_UDPSOCKET_INCLUDE
|
|||
|
#define HGL_UDPSOCKET_INCLUDE
|
|||
|
|
|||
|
#include<hgl/type/DataType.h>
|
|||
|
#include<hgl/network/Socket.h>
|
|||
|
namespace hgl
|
|||
|
{
|
|||
|
namespace network
|
|||
|
{
|
|||
|
/**
|
|||
|
* 这个类提供使用UDP协议的通信,但它并不提供可靠数据传输的支持。
|
|||
|
*/
|
|||
|
class UDPSocket:public Socket ///UDP通信类
|
|||
|
{
|
|||
|
IPAddress *bind_addr;
|
|||
|
IPAddress *tar_addr;
|
|||
|
|
|||
|
public: //事件函数
|
|||
|
|
|||
|
virtual int ProcRecv(int=-1){return -1;}
|
|||
|
virtual int ProcSend(int,int &left_bytes){return -1;}
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
UDPSocket(); ///<本类构造函数
|
|||
|
virtual ~UDPSocket(); ///<本类析构函数
|
|||
|
|
|||
|
virtual bool Create(const IPAddress *); ///<创建一个udp,并绑定一个IP地址与指定端口
|
|||
|
// virtual bool Create(int family); ///<创建一个udp
|
|||
|
|
|||
|
uint GetBindPort()const{return bind_addr->GetPort();} ///<取得绑定端口
|
|||
|
|
|||
|
bool SetSendAddr(const IPAddress *); ///<设定发送地址
|
|||
|
|
|||
|
int SendPacket(const void *,int); ///<发送数据包
|
|||
|
int SendPacket(IPAddress *,const void *,int); ///<向指定地址发送数据包
|
|||
|
int RecvPacket(void *,int,IPAddress *); ///<接收数据包
|
|||
|
};//class UDPSocket
|
|||
|
|
|||
|
/**
|
|||
|
* UDPLite协议封装使用
|
|||
|
*/
|
|||
|
class UDPLiteSocket:public UDPSocket
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
virtual ~UDPLiteSocket()=default;
|
|||
|
|
|||
|
bool Create(const IPAddress *)override; ///<创建一个udp lite,并绑定一个IP地址与指定端口
|
|||
|
// bool Create(int family)override; ///<创建一个udp lite
|
|||
|
|
|||
|
void SetChecksumCoverage(int send_val=20,int recv_val=20); ///<设定UDPLite检验位长度,最小20
|
|||
|
};//class UDPLiteSocket
|
|||
|
|
|||
|
/**
|
|||
|
* 使用回呼事件机制的UDPSocket
|
|||
|
*/
|
|||
|
template<typename BASE> class _UDPSocketCB:public BASE
|
|||
|
{
|
|||
|
public: //事件函数
|
|||
|
|
|||
|
DefEvent(void, OnDisconnect, (BASE *));
|
|||
|
DefEvent(int, OnRecv, (BASE *,int));
|
|||
|
DefEvent(int, OnSend, (BASE *,int,int &));
|
|||
|
|
|||
|
virtual void ClearEvent()
|
|||
|
{
|
|||
|
OnDisconnect=nullptr;
|
|||
|
OnRecv =nullptr;
|
|||
|
OnSend =nullptr;
|
|||
|
}
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
_UDPSocketCB(){ClearEvent();} ///<本类构造函数
|
|||
|
virtual ~_UDPSocketCB()=default;
|
|||
|
|
|||
|
virtual void ProcDisconnect()
|
|||
|
{
|
|||
|
SafeCallEvent(OnDisconnect,(this));
|
|||
|
}
|
|||
|
|
|||
|
virtual int ProcRecv(int size)
|
|||
|
{
|
|||
|
if(OnRecv==nullptr)return(-1);
|
|||
|
|
|||
|
return OnRecv(this,size);
|
|||
|
}
|
|||
|
|
|||
|
virtual int ProcSend(int size,int &left_bytes)
|
|||
|
{
|
|||
|
if(OnSend==nullptr)return(-1);
|
|||
|
|
|||
|
return OnSend(this,size,left_bytes);
|
|||
|
}
|
|||
|
};//class _UDPSocketCB
|
|||
|
|
|||
|
using UDPSocketCB =_UDPSocketCB<UDPSocket>;
|
|||
|
using UDPLiteSocketCB =_UDPSocketCB<UDPLiteSocket>;
|
|||
|
}//namespace network
|
|||
|
|
|||
|
using namespace network;
|
|||
|
}//namespace hgl
|
|||
|
#endif//HGL_UDPSOCKET_INCLUDE
|