This is the function that reports the error
func (n *Node) sendMessage(id peer.ID, p protocol.ID, data string) bool {
s, err := n.NewStream(n.Ctx, id, p)
if err != nil {
log.Println("NewStream err while sending message: ", err)
return false
}
defer s.Close()
s.Write([]byte(data))
return true
}
I call this function as follow(the last line):
log.Println("start to connect peer node by relay...", nodePeerID, nodeAddr)
peerID, err := peer.Decode(nodePeerID)
if err != nil {
log.Println(err.Error())
return
}
n.Network().(*swarm.Swarm).Backoff().Clear(peerID)
var address = nodeAddr + "/p2p/" + n.ServerAddrInfo.ID.Pretty() + "/p2p-circuit/p2p/" + peerID.Pretty()
log.Println("remote address is: ", address)
chatTargetAddr, err := multiaddr.NewMultiaddr(address)
if err != nil {
log.Println("chatTargetAddr is err")
log.Println(err.Error())
return
}
chatTargetAddrInfo := peer.AddrInfo{
ID: peerID,
Addrs: []multiaddr.Multiaddr{chatTargetAddr},
}
if err := n.Connect(n.Ctx, chatTargetAddrInfo); err != nil {
log.Println("chatTargetAddr connect by relay err")
log.Println(err.Error())
return
}
log.Println("success to establish connection with remote node by relay!")
n.chatP2PAddr = &chatTargetAddrInfo
log.Println("sending FirstP2PMsg to remote node by relay")
n.sendMessage(chatTargetAddrInfo.ID, FirstP2PMsg, "Hello Im "+chatTargetAddrInfo.ID.Pretty())
FirstP2PMsg
is a custom protocol.
When I connect to the relay node, I also call this function, but there was no problem at that time. The only difference matters is the protocol and the peerID.
I suppose that if there is any problem when I use address = nodeAddr + "/p2p/" + n.ServerAddrInfo.ID.Pretty() + "/p2p-circuit/p2p/" + peerID.Pretty()
to generate peer ID
I have no idea how to fix it.