35 pMsgConn(nullptr), pDataConn(nullptr),
37 pNext(nullptr), pParent(nullptr), pstatPing(nullptr)
125 int32_t iBestAddress = -1;
126 for (int32_t i = 0; i <
iAddrCnt; i++)
144 !addr.IsLocal() && !addr.IsPrivate() &&
152 std::set<int> interfaceIDs;
157 for (
auto id : interfaceIDs)
161 LogSilentF(
"Network: connecting client %s on %s...",
getName(), addr.ToString().getData());
185 if (bindAddr.IsNull())
return false;
189 LogSilentF(
"Network: %s TCP simultaneous open request for client %s from %s...", addr.
isIPNull() ?
"initiating" :
"responding to",
190 getName(), boundAddr.ToString().getData());
201 std::this_thread::sleep_for(std::chrono::milliseconds(std::min(ping / 2, 10)));
211 for (int32_t i = 0; i <
iAddrCnt; i++)
242 if (
hasAddr(addr))
return true;
281 for (int32_t i = 0; i <
iAddrCnt; i++)
301 static const DWORD ClientDefColors[] = {0xff0000, 0x00ff00, 0xffff00, 0x7f7fff, 0xffffff, 0x00ffff, 0xff00ff, 0x7f7f7f, 0xff7f7f, 0x7fff7f, 0x0000ff};
302 int32_t iClientColorNum =
sizeof(ClientDefColors)/
sizeof(
DWORD);
303 DWORD dwClientClr = ClientDefColors[std::max<int32_t>(
getID(), 0) % iClientColorNum];
326 : pIO(pIO), pFirst(nullptr), pLocal(nullptr)
339 if (pClient->getID() == iID)
349 if (pClient->getID() > iSmallerClientID)
350 if (!pBest || pBest->
getID() > pClient->getID())
358 if (
SEqual(pClient->getName(), szName))
366 if (pClient->hasConn(pConn))
374 if (pClient->getCore().getDiffLevel(CCore) <= iMaxDiffLevel)
412 for (; pPos; pLast = pPos, pPos = pPos->
getNext())
415 assert(!pLast || pLast->getID() != pClient->
getID());
419 pNetClient->
pNext = pPos;
420 (pLast ? pLast->pNext :
pFirst) = pNetClient;
443 if (pPrev->
getNext() == pClient)
445 if (pPrev && pPrev->
getNext() == pClient)
479 if (pClient->isConnected())
480 pClient->getMsgConn()->SetBroadcastTarget(
true);
499 if (!pClient->isHost())
500 if (pClient->isConnected())
502 pClient->getMsgConn()->SetBroadcastTarget(
true);
522 if (!pHost)
return false;
532 if (!pClient)
return false;
547 if (!pClient)
return;
549 #define GETPKT(type, name) \
550 assert(pBasePkt); const type &name = \
551 static_cast<const type &>(*pBasePkt);
570 if (pClient->
AddAddr(addr,
true))
598 pClient->SendAddresses(pConn);
607 if (!pClient->isLocal() && !pClient->isRemoved() && pClient->getNextConnAttempt() && pClient->getNextConnAttempt() <= t)
609 pClient->DoConnectAttempt(
pIO);
616 if (pClient->isWaitedFor())
623 if (!pClient->isLocal() && pClient->isWaitedFor() && !pClient->isReady())
631 if (pClient->isActivated())
const int32_t C4ClientIDHost
const int32_t C4ClientIDUnknown
bool LogSilentF(const char *strMessage,...)
#define GETPKT(type, name)
const int32_t C4NetClientConnectAttempts
const int32_t C4NetClientConnectInterval
const int32_t C4ClientMaxAddr
C4NetIOPacket MkC4NetIOPacket(char cStatus, const class C4PacketBase &Pkt, const C4NetIO::addr_t &addr=C4NetIO::addr_t())
bool SEqual(const char *szStr1, const char *szStr2)
StdIntPackAdapt< T > mkIntPackAdapt(T &rVal)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
C4Network2Client * getNetClient() const
const C4ClientCore & getCore() const
void InitNetwork(class C4Network2ClientList *pNetClients)
std::unique_ptr< C4Network2Stats > pNetworkStatistics
void SetTitle(const char *szNewTitle)
void SetColorDw(DWORD dwClr)
static std::vector< HostAddress > GetLocalAddresses()
const C4NetIO::addr_t & getAddr() const
void SetIP(C4NetIO::addr_t ip)
C4Network2IOProtocol getProtocol() const
C4Network2Address Addr[C4ClientMaxAddr]
void CloseConns(const char *szMsg)
bool DoConnectAttempt(class C4Network2IO *pIO)
void AddAddrFromPuncher(const C4NetIO::addr_t &addr)
C4Network2IOConnection * pMsgConn
bool hasAddr(const C4Network2Address &addr) const
bool DoTCPSimultaneousOpen(class C4Network2IO *pIO, const C4Network2Address &addr)
const char * getName() const
const std::set< int > & getInterfaceIDs() const
C4Network2Client(C4Client *pClient)
int32_t AddrAttempts[C4ClientMaxAddr]
void RemoveConn(C4Network2IOConnection *pConn)
class C4TableGraph * pstatPing
C4Network2IOConnection * getDataConn() const
bool SendMsg(C4NetIOPacket rPkt) const
C4Network2IOConnection * getMsgConn() const
C4Network2IOConnection * pDataConn
std::set< int > InterfaceIDs
std::unique_ptr< C4NetIOTCP::Socket > TcpSimOpenSocket
class C4Network2ClientList * pParent
void SetDataConn(C4Network2IOConnection *pConn)
bool SendData(C4NetIOPacket rPkt) const
void SendAddresses(C4Network2IOConnection *pConn)
bool AddAddr(const C4Network2Address &addr, bool fAnnounce)
const C4Network2Address & getAddr(int32_t i) const
C4Network2Client * getNext() const
C4NetIO::addr_t IPv6AddrFromPuncher
bool hasConn(C4Network2IOConnection *pConn)
void SetMsgConn(C4Network2IOConnection *pConn)
void AddLocalAddrs(int16_t iPortTCP, int16_t iPortUDP)
const C4ClientCore & getCore() const
C4ClientList * pClientList
bool AllClientsReady() const
C4Network2Client * GetClient(const char *szName) const
C4Network2Client * GetHost()
bool SendMsgToClient(int32_t iClient, C4NetIOPacket &&rPkt)
C4Network2Client * GetNextClientAfterID(int32_t iSmallerClientID) const
C4Network2Client * GetNextClient(C4Network2Client *pClient)
void UpdateClientActivity()
C4Network2Client * GetClientByID(int32_t iID) const
C4Network2Client * GetLocal() const
bool BroadcastMsgToClients(const C4NetIOPacket &rPkt)
C4Network2Client * pLocal
void Init(C4ClientList *pClientList, bool fHost)
bool BroadcastMsgToConnClients(const C4NetIOPacket &rPkt)
C4Network2Client * pFirst
bool SendMsgToHost(C4NetIOPacket rPkt)
C4Network2ClientList(C4Network2IO *pIO)
C4Network2Client * RegClient(C4Client *pClient)
void DeleteClient(C4Network2Client *pClient)
void SendAddresses(C4Network2IOConnection *pConn)
void HandlePacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2IOConnection *pConn)
C4Network2ClientList Clients
const C4NetIO::addr_t & getPeerAddr() const
bool Send(const C4NetIOPacket &rPkt)
C4Network2IOProtocol getProtocol() const
void RemoveAutoAccept(const C4ClientCore &CCore)
bool ConnectWithSocket(const C4NetIO::addr_t &addr, C4Network2IOProtocol eProt, const C4ClientCore &nCCore, std::unique_ptr< C4NetIOTCP::Socket > socket, const char *szPassword=nullptr)
void BeginBroadcast(bool fSelectAll=false)
bool Connect(const C4NetIO::addr_t &addr, C4Network2IOProtocol eProt, const C4ClientCore &nCCore, const char *szPassword=nullptr)
bool Broadcast(const C4NetIOPacket &rPkt)
C4NetIO * getNetIO(C4Network2IOProtocol eProt)
void AddAutoAccept(const C4ClientCore &CCore)
void CompileFunc(StdCompiler *pComp) override
void SetData(const StdBuf &Pkt)
void AddClient(int32_t iClient)
void SetListType(bool fnNegativeList)
void CompileFunc(StdCompiler *pComp) override
C4Player * GetAtClient(int iClient, int iIndex=0) const
void Value(const T &rStruct)
const char * getData() const
void SetAddress(const sockaddr *addr)
void SetPort(uint16_t port)
StdStrBuf ToString(int flags=0) const
void SetScopeId(int scopeId)
AddressFamily GetFamily() const