OpenClonk
C4NetIO.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
6  *
7  * Distributed under the terms of the ISC license; see accompanying file
8  * "COPYING" for details.
9  *
10  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11  * See accompanying file "TRADEMARK" for details.
12  *
13  * To redistribute this file separately, substitute the full license texts
14  * for the above references.
15  */
16 /* network i/o, featuring tcp, udp and multicast */
17 
18 #ifndef C4NETIO_H
19 #define C4NETIO_H
20 
21 #include "lib/StdCompiler.h"
22 #include "platform/StdScheduler.h"
23 #include "platform/StdSync.h"
24 
25 #ifdef _WIN32
27 #include <winsock2.h>
28 #include <ws2tcpip.h>
29 #ifndef WINSOCK_VERSION
30 #define WINSOCK_VERSION MAKEWORD(2,2)
31 #endif
32 // Events are Windows-specific
33 #define HAVE_WINSOCK
34 #else
35 #define SOCKET int
36 #define INVALID_SOCKET (-1)
37 #include <arpa/inet.h>
38 // for htons
39 #include <netinet/in.h>
40 #endif
41 
42 #ifdef HAVE_SYS_TYPES_H
43 #include <sys/types.h>
44 #endif
45 #ifdef HAVE_SYS_SOCKET_H
46 #include <sys/socket.h>
47 #endif
48 
49 #ifndef SOCK_CLOEXEC
50 #define SOCK_CLOEXEC 0
51 #endif
52 
53 #ifndef HAVE_CONFIG_H
54 // #define C4NETIO_DEBUG
55 #endif
56 
57 
58 // net i/o base class
59 class C4NetIO : public StdSchedulerProc
60 {
61 public:
62  C4NetIO();
63  ~C4NetIO() override;
64 
65  // *** constants / types
66  static const int TO_INF; // = -1;
67 
68  struct HostAddress
69  {
71  {
72  IPv6 = AF_INET6,
73  IPv4 = AF_INET,
74  UnknownFamily = 0
75  };
77  {
78  Loopback, // IPv6 localhost (::1)
79  Any, // IPv6 any-address (::)
80  AnyIPv4 // IPv4 any-address (0.0.0.0)
81  };
82 
84  {
86  TSF_SkipPort = 2
87  };
88 
89  HostAddress() { Clear(); }
90  HostAddress(const HostAddress &other) { SetHost(other); }
92  explicit HostAddress(uint32_t addr) { SetHost(addr); }
93  HostAddress(const StdStrBuf &addr) { SetHost(addr); }
94  HostAddress(const sockaddr *addr) { SetHost(addr); }
95 
96  AddressFamily GetFamily() const;
97  size_t GetAddrLen() const;
98 
99  void SetScopeId(int scopeId);
100  int GetScopeId() const;
101 
102  void Clear();
103  void SetHost(const sockaddr *addr);
104  void SetHost(const HostAddress &host);
105  void SetHost(SpecialAddress host);
106  void SetHost(const StdStrBuf &host, AddressFamily family = UnknownFamily);
107  void SetHost(uint32_t host);
108 
109  C4NetIO::HostAddress AsIPv6() const; // convert an IPv4 address to an IPv6-mapped IPv4 address
110  C4NetIO::HostAddress AsIPv4() const; // try to convert an IPv6-mapped IPv4 address to an IPv4 address (returns unchanged address if not possible)
111 
112  // General categories
113  bool IsNull() const;
114  bool IsMulticast() const;
115  bool IsLoopback() const;
116  bool IsLocal() const; // IPv6 link-local address
117  bool IsPrivate() const; // IPv6 ULA or IPv4 private address range
118 // bool IsBroadcast() const;
119 
120  StdStrBuf ToString(int flags = 0) const;
121 
122  bool operator ==(const HostAddress &rhs) const;
123  bool operator !=(const HostAddress &rhs) const { return !(*this == rhs); }
124 
125  protected:
126  // data
127  union
128  {
129  sockaddr gen;
130  sockaddr_in v4;
131  sockaddr_in6 v6;
132  };
133  };
134 
135  struct EndpointAddress : public HostAddress // Host and port
136  {
137  static const uint16_t IPPORT_NONE = 0;
138 
141  EndpointAddress& operator=(const EndpointAddress &other) { SetAddress(other); return *this; }
142  EndpointAddress(const HostAddress &host, uint16_t port = IPPORT_NONE) : HostAddress(host) { SetPort(port); }
144  explicit EndpointAddress(const StdStrBuf &addr) { SetAddress(addr); }
145 
146  StdStrBuf ToString(int flags = 0) const;
147 
148  void Clear();
149 
150  void SetAddress(const sockaddr *addr);
151  void SetAddress(const EndpointAddress &other);
152  void SetAddress(HostAddress::SpecialAddress addr, uint16_t port = IPPORT_NONE);
153  void SetAddress(const HostAddress &host, uint16_t port = IPPORT_NONE);
154  void SetAddress(const StdStrBuf &addr, AddressFamily family = UnknownFamily);
155 
156  HostAddress GetHost() const { return *this; } // HostAddress copy ctor slices off port information
157  EndpointAddress AsIPv6() const; // convert an IPv4 address to an IPv6-mapped IPv4 address
158  EndpointAddress AsIPv4() const; // try to convert an IPv6-mapped IPv4 address to an IPv4 address (returns unchanged address if not possible)
159 
160  void SetPort(uint16_t port);
161  void SetDefaultPort(uint16_t port); // set a port only if there is none
162  uint16_t GetPort() const;
163 
164  bool IsNull() const;
165  bool IsNullHost() const { return HostAddress::IsNull(); }
166 
167  // Pointer wrapper to be able to implicitly convert to sockaddr*
168  class EndpointAddressPtr;
169  const EndpointAddressPtr operator &() const;
172  {
173  EndpointAddress * const p;
176  EndpointAddressPtr(EndpointAddress *p) : p(p) {}
177  public:
178  const EndpointAddress &operator *() const { return *p; }
179  EndpointAddress &operator *() { return *p; }
180 
181  const EndpointAddress &operator ->() const { return *p; }
182  EndpointAddress &operator ->() { return *p; }
183 
184  operator const EndpointAddress*() const { return p; }
185  operator EndpointAddress*() { return p; }
186 
187  operator const sockaddr*() const { return &p->gen; }
188  operator sockaddr*() { return &p->gen; }
189 
190  operator const sockaddr_in*() const { return &p->v4; }
191  operator sockaddr_in*() { return &p->v4; }
192 
193  operator const sockaddr_in6*() const { return &p->v6; }
194  operator sockaddr_in6*() { return &p->v6; }
195  };
196 
197  bool operator ==(const EndpointAddress &rhs) const;
198  bool operator !=(const EndpointAddress &rhs) const { return !(*this == rhs); }
199 
200  // conversions
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; }
204 
205  // StdCompiler
206  void CompileFunc(StdCompiler *comp);
207 
208  private:
209  bool SetAddressByString(const StdStrBuf &address, short family);
210 
211  friend class EndpointAddressPtr;
212  };
214 
215  static std::vector<HostAddress> GetLocalAddresses();
216 
217  // callback class
218  class CBClass
219  {
220  public:
221  virtual bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO) { return true; }
222  virtual void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason) { }
223  virtual void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO) = 0;
224  virtual ~CBClass() = default;
225  };
226 
227  // used to explicitly callback to a specific class
228  template <class T>
229  class CBProxy : public CBClass
230  {
231  T *pTarget;
232  public:
233  CBProxy *operator () (T *pnTarget) { pTarget = pnTarget; return this; }
234  bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO) override
235  { return pTarget->T::OnConn(AddrPeer, AddrConnect, pOwnAddr, pNetIO); }
236  void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason) override
237  { pTarget->T::OnDisconn(AddrPeer, pNetIO, szReason); }
238  void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO) override
239  { pTarget->T::OnPacket(rPacket, pNetIO); }
240  };
241 
242 #ifdef _MSC_VER
243 #define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName) \
244  typedef class C4NetIO::CBProxy<ForClass> CBProxyT; \
245  friend CBProxyT; \
246  CBProxyT ProxyName;
247 #else
248 #define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName) \
249  friend class C4NetIO::CBProxy<ForClass>; \
250  C4NetIO::CBProxy<ForClass> ProxyName;
251 #endif
252 
253  // *** interface
254 
255  // * not multithreading safe
256  virtual bool Init(uint16_t iPort = addr_t::IPPORT_NONE) = 0;
257  virtual bool Close() = 0;
258 
259  bool Execute(int iTimeout = -1, pollfd * = nullptr) override = 0; // (for StdSchedulerProc)
260  bool IsNotify() override { return true; }
261 
262  // * multithreading safe
263  virtual bool Connect(const addr_t &addr) = 0; // async!
264  virtual bool Close(const addr_t &addr) = 0;
265 
266  virtual bool Send(const class C4NetIOPacket &rPacket) = 0;
267  virtual bool SetBroadcast(const addr_t &addr, bool fSet = true) = 0;
268  virtual bool Broadcast(const class C4NetIOPacket &rPacket) = 0;
269 
270  // statistics
271  virtual bool GetStatistic(int *pBroadcastRate) = 0;
272  virtual bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) = 0;
273  virtual void ClearStatistic() = 0;
274 
275 protected:
276 // virtual SOCKET CreateSocket() = 0;
277 
278  // Makes IPv4 connections from an IPv6 socket work.
279  bool InitIPv6Socket(SOCKET socket);
280 
281  // *** errors
282 protected:
284  void SetError(const char *strnError, bool fSockErr = false);
285 public:
286  virtual const char *GetError() const { return Error.getData(); }
287  void ResetError() { Error.Clear(); }
288 
289  // *** callbacks
290  virtual void SetCallback(CBClass *pnCallback) = 0;
291 
292 };
293 
294 // packet class
295 class C4NetIOPacket : public StdCopyBuf
296 {
297 public:
298 
300 
301  // construct from memory (copies / references data)
302  C4NetIOPacket(const void *pnData, size_t inSize, bool fCopy = false, const C4NetIO::addr_t &naddr = C4NetIO::addr_t());
303  // construct from buffer (copies data)
304  explicit C4NetIOPacket(const StdBuf &Buf, const C4NetIO::addr_t &naddr);
305  // construct from status byte + buffer (copies data)
306  C4NetIOPacket(uint8_t cStatusByte, const char *pnData, size_t inSize, const C4NetIO::addr_t &naddr = C4NetIO::addr_t());
307 
308  ~C4NetIOPacket();
309 
310 protected:
311 
312  // address
314 
315 public:
316 
317  const C4NetIO::addr_t &getAddr() const { return addr; }
318 
319  uint8_t getStatus()const { return getSize() ? *getBufPtr<char>(*this) : 0; }
320  const char *getPData() const { return getSize() ? getBufPtr<char>(*this, 1) : nullptr; }
321  size_t getPSize() const { return getSize() ? getSize() - 1 : 0; }
322  StdBuf getPBuf() const { return getSize() ? getPart(1, getSize() - 1) : getRef(); }
323 
324  // Some overloads
327  // change addr
328  void SetAddr(const C4NetIO::addr_t &naddr) { addr = naddr; }
329 
330  // delete contents
331  void Clear();
332 };
333 
334 
335 // tcp network i/o
336 class C4NetIOTCP : public C4NetIO, protected CStdCSecExCallback
337 {
338 public:
339  C4NetIOTCP();
340  ~C4NetIOTCP() override;
341 
342  // Socket is an unconnected, but bound socket.
343  class Socket
344  {
345  SOCKET sock;
346  Socket(SOCKET s) : sock(s) { }
347  friend class C4NetIOTCP;
348  public:
349  ~Socket();
350  // GetAddress returns the address the socket is bound to.
352  };
353 
354  // *** interface
355 
356  // * not multithreading safe
357  bool Init(uint16_t iPort = addr_t::IPPORT_NONE) override;
358  virtual bool InitBroadcast(addr_t *pBroadcastAddr);
359  bool Close() override;
360  virtual bool CloseBroadcast();
361 
362  bool Execute(int iMaxTime = TO_INF, pollfd * readyfds = nullptr) override;
363 
364  // * multithreading safe
365  std::unique_ptr<Socket> Bind(const addr_t &addr);
366  bool Connect(const addr_t &addr, std::unique_ptr<Socket> socket);
367  bool Connect(const addr_t &addr) override;
368  bool Close(const addr_t &addr) override;
369 
370  bool Send(const C4NetIOPacket &rPacket) override;
371  bool Broadcast(const C4NetIOPacket &rPacket) override;
372  bool SetBroadcast(const addr_t &addr, bool fSet = true) override;
373 
374  virtual void UnBlock();
375 #ifdef STDSCHEDULER_USE_EVENTS
376  HANDLE GetEvent() override;
377 #else
378  void GetFDs(std::vector<struct pollfd> & FDs) override;
379 #endif
380 
381  // statistics
382  bool GetStatistic(int *pBroadcastRate) override;
383  bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override;
384  void ClearStatistic() override;
385 
386 protected:
387 
388  // * overridables (packet format)
389 
390  // Append packet data to output buffer
391  virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf);
392 
393  // Extract a packet from the start of the input buffer (if possible) and call OnPacket.
394  // Should return the numer of bytes used.
395  virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &Addr);
396 
397  // *** data
398 
399  // peer class
400  class Peer
401  {
402  public:
403  Peer(const C4NetIO::addr_t &naddr, SOCKET nsock, C4NetIOTCP *pnParent);
404  ~Peer();
405  protected:
406  // constants
407  static const unsigned int iTCPHeaderSize; // = 28 + 24; // (bytes)
408  static const unsigned int iMinIBufSize; // = 8192; // (bytes)
409  // parent
411  // addr
413  // socket connected
415  // incoming & outgoing buffer
418  // statistics
420  // status (1 = open, 0 = closed)
421  bool fOpen;
422  // selected for broadcast?
424  // IO critical sections
426  public:
427  // data access
428  const C4NetIO::addr_t &GetAddr() const { return addr; }
429  SOCKET GetSocket() const { return sock; }
430  int GetIRate() const { return iIRate; }
431  int GetORate() const { return iORate; }
432  // send a packet to this peer
433  bool Send(const C4NetIOPacket &rPacket);
434  // send as much data of the interal outgoing buffer as possible
435  bool Send();
436  // request buffer space for new input. Must call OnRecv or NoRecv afterwards!
437  void *GetRecvBuf(int iSize);
438  // called after the buffer returned by GetRecvBuf has been filled with fresh data
439  void OnRecv(int iSize);
440  // close socket
441  void Close();
442  // test: open?
443  bool Open() const { return fOpen; }
444  // selected for broadcast?
445  bool doBroadcast() const { return fDoBroadcast; }
446  // outgoing data waiting?
447  bool hasWaitingData() const { return !OBuf.isNull(); }
448  // select/unselect peer
449  void SetBroadcast(bool fSet) { fDoBroadcast = fSet; }
450  // statistics
451  void ClearStatistics();
452  public:
453  // next peer
455  };
456  friend class Peer;
457  // peer list
458  Peer *pPeerList{nullptr};
459 
460  // small list for waited-for connections
461  struct ConnectWait
462  {
465 
467  }
468  *pConnectWaits{nullptr};
469 
472 
473  // initialized?
474  bool fInit{false};
475 
476  // listen socket
477  uint16_t iListenPort;
479 
480 #ifdef STDSCHEDULER_USE_EVENTS
481  // event indicating network activity
482  HANDLE Event{nullptr};
483 #else
484  // Pipe used for cancelling select
485  int Pipe[2];
486 #endif
487 
488  // *** implementation
489 
490  bool Listen(uint16_t inListenPort);
491 
493  bool Connect(const addr_t &addr, SOCKET nsock);
494 
495  Peer *Accept(SOCKET nsock = INVALID_SOCKET, const addr_t &ConnectAddr = addr_t());
496  Peer *GetPeer(const addr_t &addr);
497  void OnShareFree(CStdCSecEx *pCSec) override;
498 
499  void AddConnectWait(SOCKET sock, const addr_t &addr);
500  ConnectWait *GetConnectWait(const addr_t &addr);
501  void ClearConnectWaits();
502 
503  // *** callbacks
504 public:
505  void SetCallback(CBClass *pnCallback) override { pCB = pnCallback; };
506 private:
507  CBClass *pCB{nullptr};
508 
509 };
510 
511 // simple udp network i/o
512 // - No connections
513 // - Delivery not garantueed
514 // - Broadcast will multicast the packet to all clients with the same broadcast address.
515 class C4NetIOSimpleUDP : public C4NetIO
516 {
517 public:
519  ~C4NetIOSimpleUDP() override;
520 
521  bool Init(uint16_t iPort = addr_t::IPPORT_NONE) override;
522  virtual bool InitBroadcast(addr_t *pBroadcastAddr);
523  bool Close() override;
524  virtual bool CloseBroadcast();
525 
526  bool Execute(int iMaxTime = TO_INF, pollfd * = nullptr) override;
527 
528  bool Send(const C4NetIOPacket &rPacket) override;
529  bool Broadcast(const C4NetIOPacket &rPacket) override;
530 
531  virtual void UnBlock();
532 #ifdef STDSCHEDULER_USE_EVENTS
533  HANDLE GetEvent() override;
534 #else
535  void GetFDs(std::vector<struct pollfd> & FDs) override;
536 #endif
537 
538  // not implemented
539  bool Connect(const addr_t &addr) override { assert(false); return false; }
540  bool Close(const addr_t &addr) override { assert(false); return false; }
541 
542  bool SetBroadcast(const addr_t &addr, bool fSet = true) override { assert(false); return false; }
543 
544  bool GetStatistic(int *pBroadcastRate) override { assert(false); return false; }
545  bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
546  { assert(false); return false; }
547  void ClearStatistic() override { assert(false); }
548 
549 private:
550  // status
551  bool fInit{false};
552  bool fMultiCast{false};
553  uint16_t iPort;
554 
555  // the socket and the associated event
556  SOCKET sock;
557 #ifdef STDSCHEDULER_USE_EVENTS
558  HANDLE hEvent{nullptr};
559 #else
560  int Pipe[2];
561 #endif
562 
563  // multicast
564  addr_t MCAddr; ipv6_mreq MCGrpInfo;
565  bool fMCLoopback;
566 
567  // multibind
568  int fAllowReUse{false};
569 
570 protected:
571 
572  // multicast address
573  const addr_t &getMCAddr() const { return MCAddr; }
574 
575  // (try to) control loopback
576  bool SetMCLoopback(int fLoopback);
577  bool getMCLoopback() const { return fMCLoopback; }
578 
579  // enable multi-bind (call before Init!)
580  void SetReUseAddress(bool fAllow);
581 
582 private:
583 
584  // socket wait (check for readability)
585  enum WaitResult { WR_Timeout, WR_Readable, WR_Cancelled, WR_Error = -1 };
586  WaitResult WaitForSocket(int iTimeout);
587 
588  // *** callbacks
589 public:
590  void SetCallback(CBClass *pnCallback) override { pCB = pnCallback; };
591 private:
592  CBClass *pCB;
593 
594 };
595 
596 // udp network i/o
597 // - Connection are emulated
598 // - Delivery garantueed
599 // - Broadcast will automatically be activated on one side if it's active on the other side.
600 // If the peer can't be reached through broadcasting, packets will be sent directly.
602 {
603 public:
604  C4NetIOUDP();
605  ~C4NetIOUDP() override;
606 
607  // *** interface
608 
609  bool Init(uint16_t iPort = addr_t::IPPORT_NONE) override;
610  bool InitBroadcast(addr_t *pBroadcastAddr) override;
611  bool Close() override;
612  bool CloseBroadcast() override;
613 
614  bool Execute(int iMaxTime = TO_INF, pollfd * = nullptr) override;
615 
616  bool Connect(const addr_t &addr) override;
617  bool Close(const addr_t &addr) override;
618 
619  bool Send(const C4NetIOPacket &rPacket) override;
620  bool SendDirect(C4NetIOPacket &&rPacket); // (mt-safe)
621  bool Broadcast(const C4NetIOPacket &rPacket) override;
622  bool SetBroadcast(const addr_t &addr, bool fSet = true) override;
623 
625 
626  bool GetStatistic(int *pBroadcastRate) override;
627  bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override;
628  void ClearStatistic() override;
629 
630 protected:
631 
632  // *** data
633 
634  // internal packet type ids
635  enum IPTypeID
636  {
644  IPID_Close = 6
645  };
646 
647  // packet structures
648  struct BinAddr;
649  struct PacketHdr; struct TestPacket; struct ConnPacket; struct ConnOKPacket; struct AddAddrPacket;
650  struct DataPacketHdr; struct CheckPacketHdr; struct ClosePacket;
651 
652  // constants
653  static const unsigned int iVersion; // = 2;
654 
655  static const unsigned int iStdTimeout, // = 1000, // (ms)
656  iCheckInterval; // = 1000 // (ms)
657 
658  static const unsigned int iMaxOPacketBacklog; // = 100;
659 
660  static const unsigned int iUDPHeaderSize; // = 8 + 24; // (bytes)
661 
662  // packet class
663  class PacketList;
664  class Packet
665  {
666  friend class PacketList;
667  public:
668 
669  // constants / structures
670  static const size_t MaxSize; // = 1024;
671  static const size_t MaxDataSize; // = MaxSize - sizeof(Header);
672 
673  // types used for packing
674  typedef uint32_t nr_t;
675 
676  // construction / destruction
677  Packet();
678  Packet(C4NetIOPacket &&rnData, nr_t inNr);
679  ~Packet();
680 
681  protected:
682  // data
685  bool *pFragmentGot{nullptr};
686 
687  public:
688  // data access
689  C4NetIOPacket &GetData() { return Data; }
690  const C4NetIOPacket &GetData() const { return Data; }
691  nr_t GetNr() const { return iNr; }
692  bool Empty() const { return Data.isNull(); }
693  bool Multicast() const { return !!(Data.getStatus() & 0x80); }
694 
695  // fragmention
696  nr_t FragmentCnt() const;
697  C4NetIOPacket GetFragment(nr_t iFNr, bool fBroadcastFlag = false) const;
698  bool Complete() const;
699  bool FragmentPresent(nr_t iFNr) const;
700  bool AddFragment(const C4NetIOPacket &Packet, const C4NetIO::addr_t &addr);
701  protected:
702  ::size_t FragmentSize(nr_t iFNr) const;
703  // list
705  };
706  friend class Packet;
707 
709  {
710  public:
711  PacketList(unsigned int iMaxPacketCnt = ~0);
712  ~PacketList();
713 
714  protected:
715  // packet list
716  Packet *pFront{nullptr}, *pBack{nullptr};
717  // packet counts
718  unsigned int iPacketCnt{0}, iMaxPacketCnt;
719  // critical section
721 
722  public:
723  Packet *GetPacket(unsigned int iNr);
724  Packet *GetPacketFrgm(unsigned int iNr);
726  bool FragmentPresent(unsigned int iNr);
727 
728  bool AddPacket(Packet *pPacket);
729  bool DeletePacket(Packet *pPacket);
730  void ClearPackets(unsigned int iUntil);
731  void Clear();
732  };
733  friend class PacketList;
734 
735  // peer class
736  class Peer
737  {
738  public:
739 
740  // construction / destruction
741  Peer(const C4NetIO::addr_t &naddr, C4NetIOUDP *pnParent);
742  ~Peer();
743 
744  protected:
745 
746  // constants
747  static const unsigned int iConnectRetries; // = 5
748  static const unsigned int iReCheckInterval; // = 1000 (ms)
749 
750  // parent class
752 
753  // peer address
755  // alternate peer address
757  // the address used by the peer
759  // connection status
761  {
763  }
765  // does multicast work?
767  // selected for broadcast?
769  // do callback on connection timeout?
771 
772  // packet lists (outgoing, incoming, incoming multicast)
775 
776  // packet counters
777  unsigned int iOPacketCounter;
780 
781  unsigned int iMCAckPacketCounter;
782 
783  // output critical section
785 
786  // connection check time limit.
789 
790  // timeout time.
792  unsigned int iRetries;
793 
794  // statistics
797 
798  public:
799  // data access
800  const C4NetIO::addr_t &GetAddr() const { return addr; }
801  const C4NetIO::addr_t &GetAltAddr() const { return addr2; }
802 
803  // initiate connection
804  bool Connect(bool fFailCallback);
805 
806  // send something to this computer
807  bool Send(const C4NetIOPacket &rPacket);
808  // check for lost packets
809  bool Check(bool fForceCheck = true);
810 
811  // called if something from this peer was received
812  void OnRecv(const C4NetIOPacket &Packet);
813 
814  // close connection
815  void Close(const char *szReason);
816  // open?
817  bool Open() const { return eStatus == CS_Works; }
818  // closed?
819  bool Closed() const { return eStatus == CS_Closed; }
820  // multicast support?
821  bool MultiCast() const { return fMultiCast; }
822 
823  // acknowledgment check
824  unsigned int GetMCAckPacketCounter() const { return iMCAckPacketCounter; }
825 
826  // timeout checking
828  void CheckTimeout();
829 
830  // selected for broadcast?
831  bool doBroadcast() const { return fDoBroadcast; }
832  // select/unselect peer
833  void SetBroadcast(bool fSet) { fDoBroadcast = fSet; }
834 
835  // alternate address
836  void SetAltAddr(const C4NetIO::addr_t &naddr2) { addr2 = naddr2; }
837 
838  // statistics
839  int GetIRate() const { return iIRate; }
840  int GetORate() const { return iORate; }
841  int GetLoss() const { return iLoss; }
842  void ClearStatistics();
843 
844  protected:
845 
846  // helpers
847  bool DoConn(bool fMC);
848  bool DoCheck(int iAskCnt = 0, int iMCAskCnt = 0, unsigned int *pAskList = nullptr);
849 
850  // sending
851  bool SendDirect(const Packet &rPacket, unsigned int iNr = ~0);
852  bool SendDirect(C4NetIOPacket &&rPacket);
853 
854  // events
855  void OnConn();
856  void OnClose(const char *szReason);
857 
858  // incoming packet list
859  void CheckCompleteIPackets();
860 
861  // timeout
862  void SetTimeout(int iLength = iStdTimeout, int iRetryCnt = 0);
863  void OnTimeout();
864 
865  public:
866  // next peer
868  };
869  friend class Peer;
870 
871  // critical sections
875 
876  // status
877  bool fInit{false};
878  bool fMultiCast{false};
879  uint16_t iPort;
880 
881  // peer list
882  Peer *pPeerList{nullptr};
883 
884  // currently initializing - do not process packets, save them back instead
885  bool fSavePacket{false};
887 
888  // multicast support data
890  bool fDelayedLoopbackTest{false};
891 
892  // check timing.
894 
895  // outgoing packet list (for multicast)
897  unsigned int iOPacketCounter{0};
898 
899  // statistics
902 
903  // callback proxy
905 
906  // * helpers
907 
908  // sending
909  bool BroadcastDirect(const Packet &rPacket, unsigned int iNr = ~0u); // (mt-safe)
910 
911  // multicast related
912  bool DoLoopbackTest();
913  void ClearMCPackets();
914 
915  // peer list
916  void AddPeer(Peer *pPeer);
917  Peer *GetPeer(const addr_t &addr);
918  Peer *ConnectPeer(const addr_t &PeerAddr, bool fFailCallback);
919  void OnShareFree(CStdCSecEx *pCSec) override;
920 
921  // connection check
922  void DoCheck();
923 
924  // critical section: only one execute at a time
926 
927  // debug
928 #ifdef C4NETIO_DEBUG
929  int hDebugLog;
930  void OpenDebugLog();
931  void CloseDebugLog();
932  void DebugLogPkt(bool fOut, const C4NetIOPacket &Pkt);
933 #endif
934 
935  // *** callbacks
936 public:
937  void SetCallback(CBClass *pnCallback) override { pCB = pnCallback; };
938 private:
939  CBClass *pCB;
940 
941  // callback interface for C4NetIO
942  virtual bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO);
943  virtual void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason);
944  virtual void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO);
945 
946  void OnAddAddress(const addr_t &FromAddr, const AddAddrPacket &Packet);
947 };
948 
949 // net i/o management (e.g. thread support)
951 {
952 public:
953  C4NetIOMan();
954  ~C4NetIOMan() override;
955 
956  void Clear();
957 
958  void AddIO(C4NetIO *pNetIO, bool fSetCallback = true);
959  void RemoveIO(C4NetIO *pNetIO);
960 
961 protected:
962 
963  // net i/o list
965  C4NetIO **ppNetIO{nullptr};
966 
967  // overridables
968  virtual void OnError(const char *strError, C4NetIO *pNetIO) { };
969 
970 private:
971  void OnError(StdSchedulerProc *pProc) override;
972 
973  void EnlargeIO(int iBy);
974 };
975 
976 #ifdef HAVE_WINSOCK
977 bool AcquireWinSock();
978 void ReleaseWinSock();
979 #endif
980 
981 // Class that keeps winsock loaded
983 {
984 public:
986  {
987 #ifdef HAVE_WINSOCK
988  AcquireWinSock();
989 #endif
990  }
991 
993  {
994 #ifdef HAVE_WINSOCK
995  ReleaseWinSock();
996 #endif
997  }
998 };
999 
1000 
1001 #endif
#define s
#define INVALID_SOCKET
Definition: C4NetIO.h:36
#define NETIO_CREATE_CALLBACK_PROXY(ForClass, ProxyName)
Definition: C4NetIO.h:248
#define SOCKET
Definition: C4NetIO.h:35
int iSize
Definition: TstC4NetIO.cpp:32
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)
Definition: C4NetIO.h:221
virtual ~CBClass()=default
virtual void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason)
Definition: C4NetIO.h:222
void OnDisconn(const addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason) override
Definition: C4NetIO.h:236
CBProxy * operator()(T *pnTarget)
Definition: C4NetIO.h:233
bool OnConn(const addr_t &AddrPeer, const addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO) override
Definition: C4NetIO.h:234
void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO) override
Definition: C4NetIO.h:238
const EndpointAddress & operator*() const
Definition: C4NetIO.h:178
const EndpointAddress & operator->() const
Definition: C4NetIO.h:181
virtual void ClearStatistic()=0
virtual bool Close(const addr_t &addr)=0
virtual bool SetBroadcast(const addr_t &addr, bool fSet=true)=0
C4NetIO()
Definition: C4NetIO.cpp:723
virtual void SetCallback(CBClass *pnCallback)=0
static const int TO_INF
Definition: C4NetIO.h:66
virtual const char * GetError() const
Definition: C4NetIO.h:286
bool Execute(int iTimeout=-1, pollfd *=nullptr) override=0
virtual bool Init(uint16_t iPort=addr_t::IPPORT_NONE)=0
StdCopyStrBuf Error
Definition: C4NetIO.h:283
virtual bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss)=0
void ResetError()
Definition: C4NetIO.h:287
virtual bool Broadcast(const class C4NetIOPacket &rPacket)=0
void SetError(const char *strnError, bool fSockErr=false)
Definition: C4NetIO.cpp:750
virtual bool Send(const class C4NetIOPacket &rPacket)=0
~C4NetIO() override
virtual bool GetStatistic(int *pBroadcastRate)=0
bool InitIPv6Socket(SOCKET socket)
Definition: C4NetIO.cpp:730
virtual bool Close()=0
static std::vector< HostAddress > GetLocalAddresses()
Definition: C4NetIO.cpp:631
EndpointAddress addr_t
Definition: C4NetIO.h:213
virtual bool Connect(const addr_t &addr)=0
bool IsNotify() override
Definition: C4NetIO.h:260
int iNetIOCnt
Definition: C4NetIO.h:964
void Clear()
Definition: C4NetIO.cpp:3982
void AddIO(C4NetIO *pNetIO, bool fSetCallback=true)
Definition: C4NetIO.cpp:3989
void RemoveIO(C4NetIO *pNetIO)
Definition: C4NetIO.cpp:4002
virtual void OnError(const char *strError, C4NetIO *pNetIO)
Definition: C4NetIO.h:968
~C4NetIOMan() override
Definition: C4NetIO.cpp:3977
C4NetIO ** ppNetIO
Definition: C4NetIO.h:965
int iNetIOCapacity
Definition: C4NetIO.h:964
const C4NetIO::addr_t & getAddr() const
Definition: C4NetIO.h:317
void SetAddr(const C4NetIO::addr_t &naddr)
Definition: C4NetIO.h:328
C4NetIOPacket Duplicate() const
Definition: C4NetIO.h:326
uint8_t getStatus() const
Definition: C4NetIO.h:319
C4NetIO::addr_t addr
Definition: C4NetIO.h:313
const char * getPData() const
Definition: C4NetIO.h:320
StdBuf getPBuf() const
Definition: C4NetIO.h:322
void Clear()
Definition: C4NetIO.cpp:789
size_t getPSize() const
Definition: C4NetIO.h:321
C4NetIOPacket getRef() const
Definition: C4NetIO.h:325
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
Definition: C4NetIO.cpp:1898
bool Execute(int iMaxTime=TO_INF, pollfd *=nullptr) override
Definition: C4NetIO.cpp:2100
bool Connect(const addr_t &addr) override
Definition: C4NetIO.h:539
void GetFDs(std::vector< struct pollfd > &FDs) override
Definition: C4NetIO.cpp:2252
bool Close(const addr_t &addr) override
Definition: C4NetIO.h:540
bool Send(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:2180
bool SetMCLoopback(int fLoopback)
Definition: C4NetIO.cpp:2290
bool Close() override
Definition: C4NetIO.cpp:2041
bool GetStatistic(int *pBroadcastRate) override
Definition: C4NetIO.h:544
void SetCallback(CBClass *pnCallback) override
Definition: C4NetIO.h:590
void SetReUseAddress(bool fAllow)
Definition: C4NetIO.cpp:2302
~C4NetIOSimpleUDP() override
Definition: C4NetIO.cpp:1893
bool Broadcast(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:2200
bool getMCLoopback() const
Definition: C4NetIO.h:577
void ClearStatistic() override
Definition: C4NetIO.h:547
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
Definition: C4NetIO.h:542
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
Definition: C4NetIO.h:545
const addr_t & getMCAddr() const
Definition: C4NetIO.h:573
virtual bool InitBroadcast(addr_t *pBroadcastAddr)
Definition: C4NetIO.cpp:1986
virtual void UnBlock()
Definition: C4NetIO.cpp:2243
virtual bool CloseBroadcast()
Definition: C4NetIO.cpp:2082
int GetIRate() const
Definition: C4NetIO.h:430
int GetORate() const
Definition: C4NetIO.h:431
static const unsigned int iMinIBufSize
Definition: C4NetIO.h:408
void ClearStatistics()
Definition: C4NetIO.cpp:1879
C4NetIOTCP *const pParent
Definition: C4NetIO.h:410
bool Open() const
Definition: C4NetIO.h:443
bool fDoBroadcast
Definition: C4NetIO.h:423
void * GetRecvBuf(int iSize)
Definition: C4NetIO.cpp:1805
const C4NetIO::addr_t & GetAddr() const
Definition: C4NetIO.h:428
void OnRecv(int iSize)
Definition: C4NetIO.cpp:1818
SOCKET GetSocket() const
Definition: C4NetIO.h:429
bool doBroadcast() const
Definition: C4NetIO.h:445
CStdCSec OCSec
Definition: C4NetIO.h:425
bool hasWaitingData() const
Definition: C4NetIO.h:447
void SetBroadcast(bool fSet)
Definition: C4NetIO.h:449
static const unsigned int iTCPHeaderSize
Definition: C4NetIO.h:407
CStdCSec ICSec
Definition: C4NetIO.h:425
C4NetIO::addr_t addr
Definition: C4NetIO.h:412
Peer(const C4NetIO::addr_t &naddr, SOCKET nsock, C4NetIOTCP *pnParent)
Definition: C4NetIO.cpp:1735
C4NetIO::addr_t GetAddress()
Definition: C4NetIO.cpp:1160
virtual void UnBlock()
Definition: C4NetIO.cpp:1343
uint16_t iListenPort
Definition: C4NetIO.h:477
bool Send(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:1310
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
Definition: C4NetIO.cpp:811
Peer * GetPeer(const addr_t &addr)
Definition: C4NetIO.cpp:1593
virtual bool InitBroadcast(addr_t *pBroadcastAddr)
Definition: C4NetIO.cpp:851
void SetCallback(CBClass *pnCallback) override
Definition: C4NetIO.h:505
bool Close() override
Definition: C4NetIO.cpp:857
~C4NetIOTCP() override
Definition: C4NetIO.cpp:806
virtual bool CloseBroadcast()
Definition: C4NetIO.cpp:905
int Pipe[2]
Definition: C4NetIO.h:485
void ClearStatistic() override
Definition: C4NetIO.cpp:1419
ConnectWait * Next
Definition: C4NetIO.h:466
void OnShareFree(CStdCSecEx *pCSec) override
Definition: C4NetIO.cpp:1603
void AddConnectWait(SOCKET sock, const addr_t &addr)
Definition: C4NetIO.cpp:1651
bool GetStatistic(int *pBroadcastRate) override
Definition: C4NetIO.cpp:1399
CStdCSec PeerListAddCSec
Definition: C4NetIO.h:471
bool Listen(uint16_t inListenPort)
Definition: C4NetIO.cpp:1538
CStdCSecEx PeerListCSec
Definition: C4NetIO.h:470
virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf)
Definition: C4NetIO.cpp:1688
std::unique_ptr< Socket > Bind(const addr_t &addr)
Definition: C4NetIO.cpp:1192
SOCKET CreateSocket(addr_t::AddressFamily family)
Definition: C4NetIO.cpp:1172
ConnectWait * GetConnectWait(const addr_t &addr)
Definition: C4NetIO.cpp:1667
void GetFDs(std::vector< struct pollfd > &FDs) override
Definition: C4NetIO.cpp:1364
Peer * pPeerList
Definition: C4NetIO.h:458
virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &Addr)
Definition: C4NetIO.cpp:1705
SOCKET lsock
Definition: C4NetIO.h:478
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
Definition: C4NetIO.cpp:1406
bool Broadcast(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:1332
bool fInit
Definition: C4NetIO.h:474
bool Execute(int iMaxTime=TO_INF, pollfd *readyfds=nullptr) override
Definition: C4NetIO.cpp:919
void ClearConnectWaits()
Definition: C4NetIO.cpp:1677
bool Connect(const addr_t &addr, std::unique_ptr< Socket > socket)
Definition: C4NetIO.cpp:1207
Peer * Accept(SOCKET nsock=INVALID_SOCKET, const addr_t &ConnectAddr=addr_t())
Definition: C4NetIO.cpp:1427
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
Definition: C4NetIO.cpp:1321
::size_t FragmentSize(nr_t iFNr) const
Definition: C4NetIO.cpp:3038
const C4NetIOPacket & GetData() const
Definition: C4NetIO.h:690
C4NetIOPacket Data
Definition: C4NetIO.h:684
Packet * Prev
Definition: C4NetIO.h:704
C4NetIOPacket GetFragment(nr_t iFNr, bool fBroadcastFlag=false) const
Definition: C4NetIO.cpp:2952
bool Multicast() const
Definition: C4NetIO.h:693
bool Complete() const
Definition: C4NetIO.cpp:2971
nr_t FragmentCnt() const
Definition: C4NetIO.cpp:2947
static const size_t MaxDataSize
Definition: C4NetIO.h:671
C4NetIOPacket & GetData()
Definition: C4NetIO.h:689
bool AddFragment(const C4NetIOPacket &Packet, const C4NetIO::addr_t &addr)
Definition: C4NetIO.cpp:2985
uint32_t nr_t
Definition: C4NetIO.h:674
Packet * Next
Definition: C4NetIO.h:704
bool FragmentPresent(nr_t iFNr) const
Definition: C4NetIO.cpp:2980
bool Empty() const
Definition: C4NetIO.h:692
static const size_t MaxSize
Definition: C4NetIO.h:670
bool * pFragmentGot
Definition: C4NetIO.h:685
nr_t GetNr() const
Definition: C4NetIO.h:691
bool DeletePacket(Packet *pPacket)
Definition: C4NetIO.cpp:3118
unsigned int iPacketCnt
Definition: C4NetIO.h:718
PacketList(unsigned int iMaxPacketCnt=~0)
Definition: C4NetIO.cpp:3048
bool FragmentPresent(unsigned int iNr)
Definition: C4NetIO.cpp:3087
bool AddPacket(Packet *pPacket)
Definition: C4NetIO.cpp:3094
Packet * GetFirstPacketComplete()
Definition: C4NetIO.cpp:3081
CStdCSecEx ListCSec
Definition: C4NetIO.h:720
Packet * GetPacket(unsigned int iNr)
Definition: C4NetIO.cpp:3059
Packet * GetPacketFrgm(unsigned int iNr)
Definition: C4NetIO.cpp:3070
void ClearPackets(unsigned int iUntil)
Definition: C4NetIO.cpp:3138
unsigned int iMaxPacketCnt
Definition: C4NetIO.h:718
const C4NetIO::addr_t & GetAddr() const
Definition: C4NetIO.h:800
C4TimeMilliseconds tTimeout
Definition: C4NetIO.h:791
bool DoCheck(int iAskCnt=0, int iMCAskCnt=0, unsigned int *pAskList=nullptr)
Definition: C4NetIO.cpp:3506
unsigned int iOPacketCounter
Definition: C4NetIO.h:777
void Close(const char *szReason)
Definition: C4NetIO.cpp:3458
C4TimeMilliseconds tNextReCheck
Definition: C4NetIO.h:787
CStdCSec StatCSec
Definition: C4NetIO.h:796
bool fDoBroadcast
Definition: C4NetIO.h:768
enum C4NetIOUDP::Peer::ConnStatus eStatus
C4NetIO::addr_t addr
Definition: C4NetIO.h:754
unsigned int iRetries
Definition: C4NetIO.h:792
bool fConnFailCallback
Definition: C4NetIO.h:770
C4NetIOUDP *const pParent
Definition: C4NetIO.h:751
C4NetIO::addr_t addr2
Definition: C4NetIO.h:756
bool doBroadcast() const
Definition: C4NetIO.h:831
bool Open() const
Definition: C4NetIO.h:817
static const unsigned int iReCheckInterval
Definition: C4NetIO.h:748
bool Closed() const
Definition: C4NetIO.h:819
void ClearStatistics()
Definition: C4NetIO.cpp:3480
unsigned int iIMCPacketCounter
Definition: C4NetIO.h:779
void SetAltAddr(const C4NetIO::addr_t &naddr2)
Definition: C4NetIO.h:836
unsigned int iRIPacketCounter
Definition: C4NetIO.h:778
bool SendDirect(const Packet &rPacket, unsigned int iNr=~0)
Definition: C4NetIO.cpp:3530
PacketList IPackets
Definition: C4NetIO.h:774
void SetTimeout(int iLength=iStdTimeout, int iRetryCnt=0)
Definition: C4NetIO.cpp:3623
void OnClose(const char *szReason)
Definition: C4NetIO.cpp:3570
bool DoConn(bool fMC)
Definition: C4NetIO.cpp:3487
void OnRecv(const C4NetIOPacket &Packet)
Definition: C4NetIO.cpp:3246
void CheckCompleteIPackets()
Definition: C4NetIO.cpp:3581
bool Check(bool fForceCheck=true)
Definition: C4NetIO.cpp:3210
void CheckTimeout()
Definition: C4NetIO.cpp:3473
void SetBroadcast(bool fSet)
Definition: C4NetIO.h:833
unsigned int iLastPacketAsked
Definition: C4NetIO.h:788
C4TimeMilliseconds GetTimeout()
Definition: C4NetIO.h:827
int GetORate() const
Definition: C4NetIO.h:840
PacketList IMCPackets
Definition: C4NetIO.h:774
CStdCSec OutCSec
Definition: C4NetIO.h:784
bool Send(const C4NetIOPacket &rPacket)
Definition: C4NetIO.cpp:3188
bool Connect(bool fFailCallback)
Definition: C4NetIO.cpp:3181
Peer(const C4NetIO::addr_t &naddr, C4NetIOUDP *pnParent)
Definition: C4NetIO.cpp:3161
int GetIRate() const
Definition: C4NetIO.h:839
const C4NetIO::addr_t & GetAltAddr() const
Definition: C4NetIO.h:801
unsigned int GetMCAckPacketCounter() const
Definition: C4NetIO.h:824
bool MultiCast() const
Definition: C4NetIO.h:821
unsigned int iMCAckPacketCounter
Definition: C4NetIO.h:781
unsigned int iIPacketCounter
Definition: C4NetIO.h:778
static const unsigned int iConnectRetries
Definition: C4NetIO.h:747
int GetLoss() const
Definition: C4NetIO.h:841
unsigned int iRIMCPacketCounter
Definition: C4NetIO.h:779
addr_t PeerAddr
Definition: C4NetIO.h:758
unsigned int iLastMCPacketAsked
Definition: C4NetIO.h:788
PacketList OPackets
Definition: C4NetIO.h:773
bool fInit
Definition: C4NetIO.h:877
void ClearMCPackets()
Definition: C4NetIO.cpp:3738
static const unsigned int iCheckInterval
Definition: C4NetIO.h:656
bool fDelayedLoopbackTest
Definition: C4NetIO.h:890
bool Execute(int iMaxTime=TO_INF, pollfd *=nullptr) override
Definition: C4NetIO.cpp:2679
C4TimeMilliseconds GetNextTick(C4TimeMilliseconds tNow) override
Definition: C4NetIO.cpp:2783
int iBroadcastRate
Definition: C4NetIO.h:900
bool Send(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:2734
static const unsigned int iUDPHeaderSize
Definition: C4NetIO.h:660
bool DoLoopbackTest()
Definition: C4NetIO.cpp:3699
C4TimeMilliseconds tNextCheck
Definition: C4NetIO.h:893
bool SetBroadcast(const addr_t &addr, bool fSet=true) override
Definition: C4NetIO.cpp:2772
static const unsigned int iStdTimeout
Definition: C4NetIO.h:655
@ IPID_AddAddr
Definition: C4NetIO.h:641
@ IPID_Ping
Definition: C4NetIO.h:637
@ IPID_Conn
Definition: C4NetIO.h:639
@ IPID_Close
Definition: C4NetIO.h:644
@ IPID_Data
Definition: C4NetIO.h:642
@ IPID_Test
Definition: C4NetIO.h:638
@ IPID_Check
Definition: C4NetIO.h:643
@ IPID_ConnOK
Definition: C4NetIO.h:640
Peer * ConnectPeer(const addr_t &PeerAddr, bool fFailCallback)
Definition: C4NetIO.cpp:3803
CStdCSec StatCSec
Definition: C4NetIO.h:901
void SetCallback(CBClass *pnCallback) override
Definition: C4NetIO.h:937
uint16_t iPort
Definition: C4NetIO.h:879
bool Connect(const addr_t &addr) override
Definition: C4NetIO.cpp:2717
bool CloseBroadcast() override
Definition: C4NetIO.cpp:2667
CStdCSec ExecuteCSec
Definition: C4NetIO.h:925
bool SendDirect(C4NetIOPacket &&rPacket)
Definition: C4NetIO.cpp:3672
bool GetConnStatistic(const addr_t &addr, int *pIRate, int *pORate, int *pLoss) override
Definition: C4NetIO.cpp:2805
bool fMultiCast
Definition: C4NetIO.h:878
unsigned int iOPacketCounter
Definition: C4NetIO.h:897
C4NetIOPacket LastPacket
Definition: C4NetIO.h:886
bool BroadcastDirect(const Packet &rPacket, unsigned int iNr=~0u)
Definition: C4NetIO.cpp:3660
bool InitBroadcast(addr_t *pBroadcastAddr) override
Definition: C4NetIO.cpp:2501
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
Definition: C4NetIO.cpp:2472
void ClearStatistic() override
Definition: C4NetIO.cpp:2818
CStdCSec OutCSec
Definition: C4NetIO.h:874
bool Close() override
Definition: C4NetIO.cpp:2639
PacketList OPackets
Definition: C4NetIO.h:896
~C4NetIOUDP() override
Definition: C4NetIO.cpp:2467
bool fSavePacket
Definition: C4NetIO.h:885
static const unsigned int iVersion
Definition: C4NetIO.h:650
bool GetStatistic(int *pBroadcastRate) override
Definition: C4NetIO.cpp:2798
CStdCSecEx PeerListCSec
Definition: C4NetIO.h:872
CStdCSec PeerListAddCSec
Definition: C4NetIO.h:873
Peer * pPeerList
Definition: C4NetIO.h:882
static const unsigned int iMaxOPacketBacklog
Definition: C4NetIO.h:658
void OnShareFree(CStdCSecEx *pCSec) override
Definition: C4NetIO.cpp:3767
friend class Packet
Definition: C4NetIO.h:706
addr_t MCLoopbackAddr
Definition: C4NetIO.h:889
void AddPeer(Peer *pPeer)
Definition: C4NetIO.cpp:3756
Peer * GetPeer(const addr_t &addr)
Definition: C4NetIO.cpp:3793
bool Broadcast(const C4NetIOPacket &rPacket) override
Definition: C4NetIO.cpp:2745
void DoCheck()
Definition: C4NetIO.cpp:3823
Definition: StdBuf.h:30
size_t getSize() const
Definition: StdBuf.h:101
StdBuf Duplicate() const
Definition: StdBuf.h:248
StdBuf getRef() const
Definition: StdBuf.h:271
StdBuf getPart(size_t iStart, size_t inSize) const
Definition: StdBuf.h:107
bool isNull() const
Definition: StdBuf.h:98
const char * getData() const
Definition: StdBuf.h:442
void Clear()
Definition: StdBuf.h:466
~WinSockHolder()
Definition: C4NetIO.h:992
friend class EndpointAddressPtr
Definition: C4NetIO.h:211
uint16_t GetPort() const
Definition: C4NetIO.cpp:547
void SetAddress(const sockaddr *addr)
Definition: C4NetIO.cpp:364
void CompileFunc(StdCompiler *comp)
Definition: C4NetIO.cpp:618
bool IsNullHost() const
Definition: C4NetIO.h:165
EndpointAddress AsIPv6() const
Definition: C4NetIO.cpp:336
void SetPort(uint16_t port)
Definition: C4NetIO.cpp:531
EndpointAddress(HostAddress::SpecialAddress addr, uint16_t port=IPPORT_NONE)
Definition: C4NetIO.h:143
StdStrBuf ToString(int flags=0) const
Definition: C4NetIO.cpp:604
EndpointAddress(const EndpointAddress &other)
Definition: C4NetIO.h:140
void SetDefaultPort(uint16_t port)
Definition: C4NetIO.cpp:541
static const uint16_t IPPORT_NONE
Definition: C4NetIO.h:137
bool operator==(const EndpointAddress &rhs) const
Definition: C4NetIO.cpp:572
bool operator!=(const EndpointAddress &rhs) const
Definition: C4NetIO.h:198
EndpointAddress & operator=(const EndpointAddress &other)
Definition: C4NetIO.h:141
HostAddress GetHost() const
Definition: C4NetIO.h:156
EndpointAddress AsIPv4() const
Definition: C4NetIO.cpp:341
EndpointAddress(const HostAddress &host, uint16_t port=IPPORT_NONE)
Definition: C4NetIO.h:142
EndpointAddress(const StdStrBuf &addr)
Definition: C4NetIO.h:144
const EndpointAddressPtr operator&() const
Definition: C4NetIO.cpp:228
bool operator!=(const HostAddress &rhs) const
Definition: C4NetIO.h:123
void SetScopeId(int scopeId)
Definition: C4NetIO.cpp:289
HostAddress(const StdStrBuf &addr)
Definition: C4NetIO.h:93
void SetHost(const sockaddr *addr)
Definition: C4NetIO.cpp:346
StdStrBuf ToString(int flags=0) const
Definition: C4NetIO.cpp:588
HostAddress(const HostAddress &other)
Definition: C4NetIO.h:90
bool IsLocal() const
Definition: C4NetIO.cpp:260
bool operator==(const HostAddress &rhs) const
Definition: C4NetIO.cpp:558
HostAddress(const sockaddr *addr)
Definition: C4NetIO.h:94
C4NetIO::HostAddress AsIPv4() const
Definition: C4NetIO.cpp:325
bool IsMulticast() const
Definition: C4NetIO.cpp:242
bool IsNull() const
Definition: C4NetIO.cpp:508
AddressFamily GetFamily() const
Definition: C4NetIO.cpp:520
C4NetIO::HostAddress AsIPv6() const
Definition: C4NetIO.cpp:303
bool IsLoopback() const
Definition: C4NetIO.cpp:251
HostAddress(uint32_t addr)
Definition: C4NetIO.h:92
size_t GetAddrLen() const
Definition: C4NetIO.cpp:526
int GetScopeId() const
Definition: C4NetIO.cpp:296
HostAddress(SpecialAddress addr)
Definition: C4NetIO.h:91
bool IsPrivate() const
Definition: C4NetIO.cpp:270