29 #ifndef WINSOCK_VERSION
30 #define WINSOCK_VERSION MAKEWORD(2,2)
36 #define INVALID_SOCKET (-1)
37 #include <arpa/inet.h>
39 #include <netinet/in.h>
42 #ifdef HAVE_SYS_TYPES_H
43 #include <sys/types.h>
45 #ifdef HAVE_SYS_SOCKET_H
46 #include <sys/socket.h>
50 #define SOCK_CLOEXEC 0
103 void SetHost(
const sockaddr *addr);
187 operator const sockaddr*()
const {
return &p->gen; }
188 operator sockaddr*() {
return &p->gen; }
190 operator const sockaddr_in*()
const {
return &p->v4; }
191 operator sockaddr_in*() {
return &p->v4; }
193 operator const sockaddr_in6*()
const {
return &p->v6; }
194 operator sockaddr_in6*() {
return &p->v6; }
201 operator sockaddr()
const {
return gen; }
202 operator sockaddr_in()
const { assert(gen.sa_family == AF_INET);
return v4; }
203 operator sockaddr_in6()
const { assert(gen.sa_family == AF_INET6);
return v6; }
209 bool SetAddressByString(
const StdStrBuf &address,
short family);
235 {
return pTarget->T::OnConn(AddrPeer, AddrConnect, pOwnAddr, pNetIO); }
237 { pTarget->T::OnDisconn(AddrPeer, pNetIO, szReason); }
239 { pTarget->T::OnPacket(rPacket, pNetIO); }
243 #define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName) \
244 typedef class C4NetIO::CBProxy<ForClass> CBProxyT; \
248 #define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName) \
249 friend class C4NetIO::CBProxy<ForClass>; \
250 C4NetIO::CBProxy<ForClass> ProxyName;
259 bool Execute(
int iTimeout = -1, pollfd * =
nullptr)
override = 0;
284 void SetError(
const char *strnError,
bool fSockErr =
false);
320 const char *
getPData()
const {
return getSize() ? getBufPtr<char>(*
this, 1) :
nullptr; }
359 bool Close()
override;
362 bool Execute(
int iMaxTime =
TO_INF, pollfd * readyfds =
nullptr)
override;
365 std::unique_ptr<Socket>
Bind(
const addr_t &addr);
366 bool Connect(
const addr_t &addr, std::unique_ptr<Socket> socket);
375 #ifdef STDSCHEDULER_USE_EVENTS
376 HANDLE GetEvent()
override;
378 void GetFDs(std::vector<struct pollfd> & FDs)
override;
468 *pConnectWaits{
nullptr};
480 #ifdef STDSCHEDULER_USE_EVENTS
482 HANDLE Event{
nullptr};
490 bool Listen(uint16_t inListenPort);
507 CBClass *pCB{
nullptr};
523 bool Close()
override;
526 bool Execute(
int iMaxTime =
TO_INF, pollfd * =
nullptr)
override;
532 #ifdef STDSCHEDULER_USE_EVENTS
533 HANDLE GetEvent()
override;
535 void GetFDs(std::vector<struct pollfd> & FDs)
override;
540 bool Close(
const addr_t &addr)
override { assert(
false);
return false; }
544 bool GetStatistic(
int *pBroadcastRate)
override { assert(
false);
return false; }
546 { assert(
false);
return false; }
552 bool fMultiCast{
false};
557 #ifdef STDSCHEDULER_USE_EVENTS
558 HANDLE hEvent{
nullptr};
564 addr_t MCAddr; ipv6_mreq MCGrpInfo;
568 int fAllowReUse{
false};
585 enum WaitResult { WR_Timeout, WR_Readable, WR_Cancelled, WR_Error = -1 };
586 WaitResult WaitForSocket(
int iTimeout);
611 bool Close()
override;
614 bool Execute(
int iMaxTime =
TO_INF, pollfd * =
nullptr)
override;
649 struct PacketHdr;
struct TestPacket;
struct ConnPacket;
struct ConnOKPacket;
struct AddAddrPacket;
650 struct DataPacketHdr;
struct CheckPacketHdr;
struct ClosePacket;
804 bool Connect(
bool fFailCallback);
809 bool Check(
bool fForceCheck =
true);
815 void Close(
const char *szReason);
848 bool DoCheck(
int iAskCnt = 0,
int iMCAskCnt = 0,
unsigned int *pAskList =
nullptr);
856 void OnClose(
const char *szReason);
931 void CloseDebugLog();
943 virtual void OnDisconn(
const addr_t &AddrPeer,
C4NetIO *pNetIO,
const char *szReason);
946 void OnAddAddress(
const addr_t &FromAddr,
const AddAddrPacket &
Packet);
973 void EnlargeIO(
int iBy);
977 bool AcquireWinSock();
978 void ReleaseWinSock();
#define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName)
virtual void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO)=0
virtual bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO)
virtual ~CBClass()=default
virtual void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason)
void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason) override
CBProxy * operator()(T *pnTarget)
bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO) override
void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO) override
const EndpointAddress & operator*() const
const EndpointAddress & operator->() const
virtual void ClearStatistic()=0
virtual bool Close(const addr_t &addr)=0
virtual bool SetBroadcast(const addr_t &addr, bool fSet=true)=0
virtual void SetCallback(CBClass *pnCallback)=0
virtual const char * GetError() const
bool Execute(int iTimeout=-1, pollfd *=nullptr) override=0
virtual bool Init(uint16_t iPort=addr_t::IPPORT_NONE)=0
virtual bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss)=0
virtual bool Broadcast(const class C4NetIOPacket &rPacket)=0
void SetError(const char *strnError, bool fSockErr=false)
virtual bool Send(const class C4NetIOPacket &rPacket)=0
virtual bool GetStatistic(int *pBroadcastRate)=0
bool InitIPv6Socket(SOCKET socket)
static std::vector< HostAddress > GetLocalAddresses()
virtual bool Connect(const addr_t &addr)=0
void AddIO(C4NetIO *pNetIO, bool fSetCallback=true)
void RemoveIO(C4NetIO *pNetIO)
virtual void OnError(const char *strError, C4NetIO *pNetIO)
const C4NetIO::addr_t & getAddr() const
void SetAddr(const C4NetIO::addr_t &naddr)
C4NetIOPacket Duplicate() const
uint8_t getStatus() const
const char * getPData() const
C4NetIOPacket getRef() const
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
bool Execute(int iMaxTime=TO_INF, pollfd *=nullptr) override
bool Connect(const addr_t &addr) override
void GetFDs(std::vector< struct pollfd > &FDs) override
bool Close(const addr_t &addr) override
bool Send(const C4NetIOPacket &rPacket) override
bool SetMCLoopback(int fLoopback)
bool GetStatistic(int *pBroadcastRate) override
void SetCallback(CBClass *pnCallback) override
void SetReUseAddress(bool fAllow)
~C4NetIOSimpleUDP() override
bool Broadcast(const C4NetIOPacket &rPacket) override
bool getMCLoopback() const
void ClearStatistic() override
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
const addr_t & getMCAddr() const
virtual bool InitBroadcast(addr_t *pBroadcastAddr)
virtual bool CloseBroadcast()
static const unsigned int iMinIBufSize
C4NetIOTCP *const pParent
void * GetRecvBuf(int iSize)
const C4NetIO::addr_t & GetAddr() const
bool hasWaitingData() const
void SetBroadcast(bool fSet)
static const unsigned int iTCPHeaderSize
Peer(const C4NetIO::addr_t &naddr, SOCKET nsock, C4NetIOTCP *pnParent)
C4NetIO::addr_t GetAddress()
bool Send(const C4NetIOPacket &rPacket) override
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
Peer * GetPeer(const addr_t &addr)
virtual bool InitBroadcast(addr_t *pBroadcastAddr)
void SetCallback(CBClass *pnCallback) override
virtual bool CloseBroadcast()
void ClearStatistic() override
void OnShareFree(CStdCSecEx *pCSec) override
void AddConnectWait(SOCKET sock, const addr_t &addr)
bool GetStatistic(int *pBroadcastRate) override
bool Listen(uint16_t inListenPort)
virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf)
std::unique_ptr< Socket > Bind(const addr_t &addr)
SOCKET CreateSocket(addr_t::AddressFamily family)
ConnectWait * GetConnectWait(const addr_t &addr)
void GetFDs(std::vector< struct pollfd > &FDs) override
virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &Addr)
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
bool Broadcast(const C4NetIOPacket &rPacket) override
bool Execute(int iMaxTime=TO_INF, pollfd *readyfds=nullptr) override
bool Connect(const addr_t &addr, std::unique_ptr< Socket > socket)
Peer * Accept(SOCKET nsock=INVALID_SOCKET, const addr_t &ConnectAddr=addr_t())
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
::size_t FragmentSize(nr_t iFNr) const
const C4NetIOPacket & GetData() const
C4NetIOPacket GetFragment(nr_t iFNr, bool fBroadcastFlag=false) const
static const size_t MaxDataSize
C4NetIOPacket & GetData()
bool AddFragment(const C4NetIOPacket &Packet, const C4NetIO::addr_t &addr)
bool FragmentPresent(nr_t iFNr) const
static const size_t MaxSize
bool DeletePacket(Packet *pPacket)
PacketList(unsigned int iMaxPacketCnt=~0)
bool FragmentPresent(unsigned int iNr)
bool AddPacket(Packet *pPacket)
Packet * GetFirstPacketComplete()
Packet * GetPacket(unsigned int iNr)
Packet * GetPacketFrgm(unsigned int iNr)
void ClearPackets(unsigned int iUntil)
unsigned int iMaxPacketCnt
const C4NetIO::addr_t & GetAddr() const
C4TimeMilliseconds tTimeout
bool DoCheck(int iAskCnt=0, int iMCAskCnt=0, unsigned int *pAskList=nullptr)
unsigned int iOPacketCounter
void Close(const char *szReason)
C4TimeMilliseconds tNextReCheck
enum C4NetIOUDP::Peer::ConnStatus eStatus
C4NetIOUDP *const pParent
static const unsigned int iReCheckInterval
unsigned int iIMCPacketCounter
void SetAltAddr(const C4NetIO::addr_t &naddr2)
unsigned int iRIPacketCounter
bool SendDirect(const Packet &rPacket, unsigned int iNr=~0)
void SetTimeout(int iLength=iStdTimeout, int iRetryCnt=0)
void OnClose(const char *szReason)
void OnRecv(const C4NetIOPacket &Packet)
void CheckCompleteIPackets()
bool Check(bool fForceCheck=true)
void SetBroadcast(bool fSet)
unsigned int iLastPacketAsked
C4TimeMilliseconds GetTimeout()
bool Send(const C4NetIOPacket &rPacket)
bool Connect(bool fFailCallback)
Peer(const C4NetIO::addr_t &naddr, C4NetIOUDP *pnParent)
const C4NetIO::addr_t & GetAltAddr() const
unsigned int GetMCAckPacketCounter() const
unsigned int iMCAckPacketCounter
unsigned int iIPacketCounter
static const unsigned int iConnectRetries
unsigned int iRIMCPacketCounter
unsigned int iLastMCPacketAsked
static const unsigned int iCheckInterval
bool fDelayedLoopbackTest
bool Execute(int iMaxTime=TO_INF, pollfd *=nullptr) override
C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow) override
bool Send(const C4NetIOPacket &rPacket) override
static const unsigned int iUDPHeaderSize
C4TimeMilliseconds tNextCheck
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
static const unsigned int iStdTimeout
Peer * ConnectPeer(const addr_t &PeerAddr, bool fFailCallback)
void SetCallback(CBClass *pnCallback) override
bool Connect(const addr_t &addr) override
bool CloseBroadcast() override
bool SendDirect(C4NetIOPacket &&rPacket)
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
unsigned int iOPacketCounter
bool BroadcastDirect(const Packet &rPacket, unsigned int iNr=~0u)
bool InitBroadcast(addr_t *pBroadcastAddr) override
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
void ClearStatistic() override
static const unsigned int iVersion
bool GetStatistic(int *pBroadcastRate) override
static const unsigned int iMaxOPacketBacklog
void OnShareFree(CStdCSecEx *pCSec) override
void AddPeer(Peer *pPeer)
Peer * GetPeer(const addr_t &addr)
bool Broadcast(const C4NetIOPacket &rPacket) override
StdBuf getPart(size_t iStart, size_t inSize) const
const char * getData() const
friend class EndpointAddressPtr
void SetAddress(const sockaddr *addr)
void CompileFunc(StdCompiler *comp)
EndpointAddress AsIPv6() const
void SetPort(uint16_t port)
EndpointAddress(HostAddress::SpecialAddress addr, uint16_t port=IPPORT_NONE)
StdStrBuf ToString(int flags=0) const
EndpointAddress(const EndpointAddress &other)
void SetDefaultPort(uint16_t port)
static const uint16_t IPPORT_NONE
bool operator==(const EndpointAddress &rhs) const
bool operator!=(const EndpointAddress &rhs) const
EndpointAddress & operator=(const EndpointAddress &other)
HostAddress GetHost() const
EndpointAddress AsIPv4() const
EndpointAddress(const HostAddress &host, uint16_t port=IPPORT_NONE)
EndpointAddress(const StdStrBuf &addr)
const EndpointAddressPtr operator&() const
bool operator!=(const HostAddress &rhs) const
void SetScopeId(int scopeId)
HostAddress(const StdStrBuf &addr)
void SetHost(const sockaddr *addr)
StdStrBuf ToString(int flags=0) const
HostAddress(const HostAddress &other)
bool operator==(const HostAddress &rhs) const
HostAddress(const sockaddr *addr)
C4NetIO::HostAddress AsIPv4() const
AddressFamily GetFamily() const
C4NetIO::HostAddress AsIPv6() const
HostAddress(uint32_t addr)
size_t GetAddrLen() const
HostAddress(SpecialAddress addr)