diff --git a/examples/datagram/README.md b/examples/datagram/README.md new file mode 100644 index 0000000000000000000000000000000000000000..68f40394964e2b2cf643fc4284c109797c37fb55 --- /dev/null +++ b/examples/datagram/README.md @@ -0,0 +1,55 @@ +# Datagram protocols with libp2p + +This libp2p example is a form of readme-driven development for packet switching. +I'm using it to test out interfaces and conventions, and also to produce working code. + +For now it's going to be the simplest possible echo server/client. + +## Additions + +package p2phost +type MsgHandler func(peer.ID, protocol.ID, []byte) +type Host interface { + MsgMux() *msmux.MultigramMuxer + SetMsgHandler(protocol.ID, inet.MsgHandler) + SetMsgHandlerMatch(protocol.ID, func(string) bool, MsgHandler) + RemoveMsgHandler(protocol.ID) + WriteMsg(context.Context, peer.ID, ...protocol.ID, []byte) +} + +package p2pswarm +type MsgHandler func(peer.ID, []byte) +func (s *Swarm) AddPacketTransport(p2ptransport.PacketTransport) {} +func (s *Swarm) SetMsgHandler(MsgHandler) {} +func (s *Swarm) MsgHandler() MsgHandler {} + +package p2piconn +type PacketConn interface {} + +package p2pnet + +package p2pstream +func NoOpMsgHandler(msg []byte, peeridOrConn) {} + +package p2ptransport + +package udptransport + +package manet + +## TODO + +- [ ] go-multiaddr-net datagram support +- [ ] go-libp2p-transport datagram support +- [ ] go-udp-transport +- [ ] go-peerstream datagram support +- [ ] go-libp2p-swarm datagram support +- [ ] go-multigram +- [ ] go-shs vs. go-dtls vs. go-cryptoauth +- [ ] label-based switch +- [ ] overlay routing interfaces + + +## PR + +This PR adds APIs for message-based communication diff --git a/examples/datagram/main.go b/examples/datagram/main.go new file mode 100644 index 0000000000000000000000000000000000000000..074be0d19ec0a2a8faffa9edf46ffb2d2dc74e82 --- /dev/null +++ b/examples/datagram/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "context" + "fmt" + "os" + + swarm "github.com/libp2p/go-libp2p-swarm" + udpt "github.com/libp2p/go-udp-transport" + ma "github.com/multiformats/go-multiaddr" +) + +func fatal(i interface{}) { + fmt.Println(i) + os.Exit(1) +} + +// XXX unrewritten broken because jbenet/go-stream-muxer is out of date +// TODO move to libp2p org: go-stream-muxer go-smux-multistream go-smux-spdystream go-smux-yamux +// TODO multigram will live in BasicHost, for now it's only swarm + +func main() { + laddr, err := ma.NewMultiaddr("/ip4/0.0.0.0/udp/4737") + if err != nil { + fatal(err) + } + + s := swarm.NewBlankSwarm(context.Background(), "Qmbob", nil, nil) + s.AddPacketTransport(udpt.NewUDPTransport()) + + // Add an address to start listening on + err = s.AddListenAddr(laddr) + if err != nil { + fatal(err) + } + + // Conn as argument, for WriteMsg()? + s.SetMsgHandler(func(msg []byte, peerid string) { + fmt.Printf("got message from %s: %s\n", peerid, string(msg)) + + _, err = s.WriteMsg(msg, peerid) + if err != nil { + fmt.Println(err) + return + } + }) + + s.WriteMsg("hey bob", "Qmbob") + + // Wait forever + <-make(chan bool) +}