diff --git a/main.go b/main.go index 00aee4f..9b14588 100644 --- a/main.go +++ b/main.go @@ -7,12 +7,12 @@ import ( "fmt" "log" "os" + "strings" "sync" "time" "github.com/libp2p/go-libp2p" dht "github.com/libp2p/go-libp2p-kad-dht" - // "github.com/libp2p/go-libp2p/core/host" <-- BU SATIR SİLİNDİ (Hata sebebiydi) "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/p2p/discovery/routing" @@ -27,32 +27,34 @@ func main() { ctx := context.Background() - // 1. Libp2p Host'u oluştur (NAT Traversal ve Relay özellikleri açık) + // 1. Libp2p Host'u oluştur (ZORLANMIŞ GİZLİLİK MODU) h, err := libp2p.New( - libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0", "/ip4/0.0.0.0/udp/0/quic-v1"), // TCP ve QUIC dinle - libp2p.EnableHolePunching(), // NAT arkasından geçmeyi dene + libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0", "/ip4/0.0.0.0/udp/0/quic-v1"), + libp2p.EnableHolePunching(), libp2p.EnableNATService(), - libp2p.EnableRelay(), // Relay üzerinden geçmeye izin ver + libp2p.EnableRelay(), + libp2p.EnableAutoRelay(), + // ÖNEMLİ: Kendimizi "Gizli" olarak işaretliyoruz ki sistem bizi Relay kullanmaya zorlasın. + libp2p.ForceReachabilityPrivate(), ) if err != nil { log.Fatal(err) } fmt.Printf("[*] Düğüm Başladı ID: %s\n", h.ID()) - fmt.Println("[*] Küresel ağa bağlanılıyor (Bootstrapping)... Bu biraz sürebilir.") + fmt.Println("[*] Küresel ağa bağlanılıyor (Bootstrapping)...") - // 2. DHT (Distributed Hash Table) Başlat - kademliaDHT, err := dht.New(ctx, h) + // 2. DHT Başlat (ModeClient: Biz sunucu değiliz, sadece istemciyiz diyoruz, daha hızlı bağlanır) + kademliaDHT, err := dht.New(ctx, h, dht.Mode(dht.ModeClient)) if err != nil { log.Fatal(err) } - // 3. Bootstrap (Başlangıç) Düğümlerine Bağlan if err = kademliaDHT.Bootstrap(ctx); err != nil { log.Fatal(err) } - // Halka açık varsayılan IPFS düğümlerine bağlanarak ağa dahil ol + // 3. Bootstrap Düğümlerine Bağlan var wg sync.WaitGroup for _, peerAddr := range dht.DefaultBootstrapPeers { peerinfo, _ := peer.AddrInfoFromP2pAddr(peerAddr) @@ -60,22 +62,41 @@ func main() { go func() { defer wg.Done() if err := h.Connect(ctx, *peerinfo); err != nil { - // Bazılarına bağlanamamak normaldir } }() } wg.Wait() - fmt.Println("[+] Küresel ağa bağlandık! Şimdi arkadaşın aranıyor...") + fmt.Println("[+] IPFS Ağına Bağlanıldı.") - // 4. Stream Handler (Gelen mesajları karşıla) + // 4. RELAY ADRESİ BEKLEME DÖNGÜSÜ (YENİ) + // Relay adresi almadan reklam yaparsak kimse bize bağlanamaz. + fmt.Print("[*] Bir Relay sunucusundan yer ayrılması bekleniyor...") + for { + hasRelay := false + for _, addr := range h.Addrs() { + // Adresler içinde /p2p-circuit/ var mı diye bakıyoruz + if strings.Contains(addr.String(), "p2p-circuit") { + hasRelay = true + break + } + } + if hasRelay { + fmt.Println("\n[+] Relay Tüneli Hazır! Artık erişilebilirsin.") + break + } + fmt.Print(".") + time.Sleep(time.Second * 1) + } + + // 5. Stream Handler h.SetStreamHandler(protocolID, handleStream) - // 5. Discovery (Keşif) Mekanizması + // 6. Discovery (Keşif) - ARTIK GÜVENLE YAYIN YAPABİLİRİZ routingDiscovery := routing.NewRoutingDiscovery(kademliaDHT) dutil.Advertise(ctx, routingDiscovery, *rendezvousString) fmt.Printf("[*] '%s' frekansında yayın yapılıyor.\n", *rendezvousString) - // 6. Arkadaşı Ara ve Bağlan + // 7. Arkadaşı Ara ve Bağlan go func() { for { peerChan, err := routingDiscovery.FindPeers(ctx, *rendezvousString) @@ -85,29 +106,23 @@ func main() { for peer := range peerChan { if peer.ID == h.ID() { - continue // Kendimize bağlanmayalım + continue } fmt.Printf("[?] Bulunan Peer: %s. Bağlanılıyor...\n", peer.ID) - // BAĞLANTIYI DENE VE HATAYI YAZDIR - if err := h.Connect(ctx, peer); err != nil { - // Kırmızı renkle hatayı göster - fmt.Printf("\x1b[31m[!] HATA: Bağlantı başarısız: %s\x1b[0m\n", err) - - // Eğer adres listesi boşsa, sorun DHT'dedir - if len(peer.Addrs) == 0 { - fmt.Println(" -> Sebep: Peer adresi bulunamadı (Adres listesi boş).") - } else { - fmt.Println(" -> Denenen adresler:", peer.Addrs) - } - - continue // Sonraki denemeye geç + // Bağlantıyı daha agresif dene + ctxConnect, cancel := context.WithTimeout(ctx, time.Second*30) + err := h.Connect(ctxConnect, peer) + cancel() + + if err != nil { + fmt.Printf("\x1b[31m[!] HATA: %s\x1b[0m\n", err) + continue } fmt.Printf("[+] BAĞLANTI BAŞARILI! Tünel Kuruldu: %s\n", peer.ID) - // Stream aç stream, err := h.NewStream(ctx, peer.ID, protocolID) if err != nil { fmt.Println("Stream hatası:", err) @@ -117,13 +132,13 @@ func main() { rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream)) go readData(rw) go writeData(rw) - return // Bir kişi bulduk ve bağlandık, aramayı durdur + return } - time.Sleep(time.Second * 2) // Kimse yoksa 2 saniye sonra tekrar ara + time.Sleep(time.Second * 3) } }() - select {} // Programı açık tut + select {} } func handleStream(s network.Stream) {