github.com/gdamore/mangos@v1.4.0/examples/pair/pair.go (about) 1 // Copyright 2018 The Mangos Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use file except in compliance with the License. 5 // You may obtain a copy of the license at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // pair implements a pair example. node0 is a listening 16 // pair socket, and node1 is a dialing pair socket. 17 // 18 // To use: 19 // 20 // $ go build . 21 // $ url=tcp://127.0.0.1:40899 22 // $ ./pair node0 $url & node0=$! 23 // $ ./pair node1 $url & node1=$! 24 // $ sleep 3 25 // $ kill $node0 $node1 26 // 27 package main 28 29 import ( 30 "fmt" 31 "os" 32 "time" 33 34 "nanomsg.org/go-mangos" 35 "nanomsg.org/go-mangos/protocol/pair" 36 "nanomsg.org/go-mangos/transport/ipc" 37 "nanomsg.org/go-mangos/transport/tcp" 38 ) 39 40 func die(format string, v ...interface{}) { 41 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 42 os.Exit(1) 43 } 44 45 func sendName(sock mangos.Socket, name string) { 46 fmt.Printf("%s: SENDING \"%s\"\n", name, name) 47 if err := sock.Send([]byte(name)); err != nil { 48 die("failed sending: %s", err) 49 } 50 } 51 52 func recvName(sock mangos.Socket, name string) { 53 var msg []byte 54 var err error 55 if msg, err = sock.Recv(); err == nil { 56 fmt.Printf("%s: RECEIVED: \"%s\"\n", name, string(msg)) 57 } 58 } 59 60 func sendRecv(sock mangos.Socket, name string) { 61 for { 62 sock.SetOption(mangos.OptionRecvDeadline, 100*time.Millisecond) 63 recvName(sock, name) 64 time.Sleep(time.Second) 65 sendName(sock, name) 66 } 67 } 68 69 func node0(url string) { 70 var sock mangos.Socket 71 var err error 72 if sock, err = pair.NewSocket(); err != nil { 73 die("can't get new pair socket: %s", err) 74 } 75 sock.AddTransport(ipc.NewTransport()) 76 sock.AddTransport(tcp.NewTransport()) 77 if err = sock.Listen(url); err != nil { 78 die("can't listen on pair socket: %s", err.Error()) 79 } 80 sendRecv(sock, "node0") 81 } 82 83 func node1(url string) { 84 var sock mangos.Socket 85 var err error 86 87 if sock, err = pair.NewSocket(); err != nil { 88 die("can't get new pair socket: %s", err.Error()) 89 } 90 sock.AddTransport(ipc.NewTransport()) 91 sock.AddTransport(tcp.NewTransport()) 92 if err = sock.Dial(url); err != nil { 93 die("can't dial on pair socket: %s", err.Error()) 94 } 95 sendRecv(sock, "node1") 96 } 97 98 func main() { 99 if len(os.Args) > 2 && os.Args[1] == "node0" { 100 node0(os.Args[2]) 101 os.Exit(0) 102 } 103 if len(os.Args) > 2 && os.Args[1] == "node1" { 104 node1(os.Args[2]) 105 os.Exit(0) 106 } 107 fmt.Fprintf(os.Stderr, "Usage: pair node0|node1 <URL>\n") 108 os.Exit(1) 109 }