Files
p2pNetwork/main.go
Atakan Özgün b5f4f363ee new
2025-12-04 03:59:18 +03:00

169 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"bufio"
"context"
"flag"
"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/network"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/p2p/discovery/routing"
dutil "github.com/libp2p/go-libp2p/p2p/discovery/util"
)
const protocolID = "/onion-chat/1.0.0"
func main() {
rendezvousString := flag.String("r", "gizli-tunel-sifresi", "Buluşma noktası için gizli kelime")
flag.Parse()
ctx := context.Background()
// 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"),
libp2p.EnableHolePunching(),
libp2p.EnableNATService(),
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)...")
// 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)
}
if err = kademliaDHT.Bootstrap(ctx); err != nil {
log.Fatal(err)
}
// 3. Bootstrap Düğümlerine Bağlan
var wg sync.WaitGroup
for _, peerAddr := range dht.DefaultBootstrapPeers {
peerinfo, _ := peer.AddrInfoFromP2pAddr(peerAddr)
wg.Add(1)
go func() {
defer wg.Done()
if err := h.Connect(ctx, *peerinfo); err != nil {
}
}()
}
wg.Wait()
fmt.Println("[+] IPFS Ağına Bağlanıldı.")
// 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)
// 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)
// 7. Arkadaşı Ara ve Bağlan
go func() {
for {
peerChan, err := routingDiscovery.FindPeers(ctx, *rendezvousString)
if err != nil {
panic(err)
}
for peer := range peerChan {
if peer.ID == h.ID() {
continue
}
fmt.Printf("[?] Bulunan Peer: %s. Bağlanılıyor...\n", peer.ID)
// 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, err := h.NewStream(ctx, peer.ID, protocolID)
if err != nil {
fmt.Println("Stream hatası:", err)
continue
}
rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))
go readData(rw)
go writeData(rw)
return
}
time.Sleep(time.Second * 3)
}
}()
select {}
}
func handleStream(s network.Stream) {
fmt.Println("\n[!] Biri tünelimize giriş yaptı!")
rw := bufio.NewReadWriter(bufio.NewReader(s), bufio.NewWriter(s))
go readData(rw)
go writeData(rw)
}
func readData(rw *bufio.ReadWriter) {
for {
str, err := rw.ReadString('\n')
if err != nil {
return
}
fmt.Printf("\x1b[32m%s\x1b[0m: %s", "Gelen", str)
}
}
func writeData(rw *bufio.ReadWriter) {
stdReader := bufio.NewReader(os.Stdin)
for {
fmt.Print("> ")
sendData, _ := stdReader.ReadString('\n')
rw.WriteString(sendData)
rw.Flush()
}
}