#include "fiko/orkestra/tasima_lan.hpp" namespace fiko::orkestra { void LanKesif::tik(NodeKayitDefteri& defter, uint64_t simdiMs) { // 1) Beacon gönder (throttle). Kimliksiz ilan yayınlanmaz (kule henüz kurmadı). if (kendi_.nodeId != 0 && (sonBeaconMs_ == 0 || simdiMs - sonBeaconMs_ >= beaconAralikMs_)) { sonBeaconMs_ = simdiMs; SurecCerceve c; c.tip = SurecMesajTip::NodeIlan; c.govde = nodeproto::ilanSerialize(kendi_); if (soket_.gonderYayin(surecproto::cerceveSerialize(c))) ++gonderilen_; if (metrikVar_) { // kaynak nabzı — ayrı datagram (ilan sade kalır, eski çözücüler etkilenmez) SurecCerceve m; m.tip = SurecMesajTip::NodeMetrik; m.govde = nodeproto::metrikSerialize(kendi_.nodeId, kendiMetrik_); if (soket_.gonderYayin(surecproto::cerceveSerialize(m))) ++gonderilen_; } } // 2) Gelenleri boşalt (sınırlı — kötü komşu kareyi kilitleyemez). std::string veri, kaynakIp; for (int i = 0; i < MAKS_DATAGRAM && soket_.al(veri, &kaynakIp); ++i) { ++alinan_; SurecCerceve c; if (!surecproto::cerceveDeserialize(veri.data(), veri.size(), c)) { ++yoksayilan_; continue; } if (c.tip == SurecMesajTip::NodeIlan) { NodeBilgi ilan; if (!nodeproto::ilanCoz(c.govde, ilan) || ilan.nodeId == kendi_.nodeId) { ++yoksayilan_; // bozuk gövde ya da kendi loopback beaconumuz continue; } ilan.ip = kaynakIp; // beacon kaynağı — giden eşleştirme/kanal adresi defter.ilanIsle(ilan, simdiMs); // yeni → katildi; mevcut → tazele (dogrulanmis=yerel) } else if (c.tip == SurecMesajTip::NodeMetrik) { uint64_t nodeId = 0; NodeMetrikOzet m; if (!nodeproto::metrikCoz(c.govde, nodeId, m) || nodeId == kendi_.nodeId) { ++yoksayilan_; // bozuk ya da kendi loopback metriğimiz continue; } defter.metrikIsle(nodeId, m, simdiMs); // ilanı gelmemiş node sessiz yok sayılır } else { ++yoksayilan_; // beacon-dışı tip (TCP kanalının işi) } } } } // namespace fiko::orkestra