0

I am a beginner and am currently playing with the pubsub example from libp2p given here https://github.com/libp2p/go-libp2p/tree/master/examples/pubsub/basic-chat-with-rendezvous

I have been able to build the code and run the binary in different terminals and it works. I am trying to automate this process from the main.go program itself where I can create a few threads to spin up new agents where they publish messages to the network and the rest of the peers subscribe to it. I have provided the modified code I have built currently but it doesnt seem to work. The peers cannot discover each other.

func main() {
    help := flag.Bool("help", false, "Display Help")
    cfg := parseFlags()

    if *help {
        fmt.Printf("Simple example for peer discovery using mDNS. mDNS is great when you have multiple peers in local LAN.")
        fmt.Printf("Usage: \n   Run './chat-with-mdns'\nor Run './chat-with-mdns -host [host] -port [port] -rendezvous [string] -pid [proto ID]'\n")

        os.Exit(0)
    }

    fmt.Printf("[*] Listening on: %s with port: %d\n", cfg.listenHost, cfg.listenPort)
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        // Spawn a thread for each iteration in the loop.
        // Pass 'i' into the goroutine's function
        //   in order to make sure each goroutine
        //   uses a different value for 'i'.
        wg.Add(5)
        go func(i int) {
            // At the end of the goroutine, tell the WaitGroup
            //   that another thread has completed.
            defer wg.Done()
            ctx := context.Background()
            r := rand.Reader

            // Creates a new RSA key pair for this host.
            prvKey, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
            if err != nil {
                panic(err)
            }

            // 0.0.0.0 will listen on any interface device.
            sourceMultiAddr, _ := multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/%s/tcp/%d", cfg.listenHost, cfg.listenPort))

            // libp2p.New constructs a new libp2p Host.
            // Other options can be added here.
            host, err := libp2p.New(
                libp2p.ListenAddrs(sourceMultiAddr),
                libp2p.Identity(prvKey),
            )
            if err != nil {
                panic(err)
            }

            // Set a function as stream handler.
            // This function is called when a peer initiates a connection and starts a stream with this peer.
            host.SetStreamHandler(protocol.ID(cfg.ProtocolID), handleStream)

            fmt.Printf("\n[*] Your Multiaddress Is: /ip4/%s/tcp/%v/p2p/%s\n", cfg.listenHost, cfg.listenPort, host.ID().Pretty())

            peerChan := initMDNS(host, cfg.RendezvousString)
            for { // allows multiple peers to join
                peer := <-peerChan // will block untill we discover a peer // the code currently hangs here
                fmt.Println("Found peer:", peer, ", connecting")

                if err := host.Connect(ctx, peer); err != nil {
                    fmt.Println("Connection failed:", err)
                    continue
                }
                //** this part of the code is experimental and is not accessed by any thread yet **//
                stream, err := host.NewStream(ctx, peer.ID, protocol.ID(cfg.ProtocolID))

                if err != nil {
                    fmt.Println("Stream open failed", err)
                } else {
                    rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))

                    go writeData(rw)
                    go readData(rw)
                    fmt.Println("Connected to:", peer)
                }
                //** this part of the code is experimental and is not accessed by any thread yet **//
            }

        }(i)
    }
    fmt.Println("exit")

    wg.Wait()

    fmt.Println("Finished for loop")
}

But this doesn't seem to work. Are there any examples I can look at currently for solving this error.

babla34
  • 15
  • 4

0 Answers0