go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/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 "go.nanomsg.org/mangos/v3" 35 "go.nanomsg.org/mangos/v3/protocol/pair" 36 37 // register transports 38 _ "go.nanomsg.org/mangos/v3/transport/all" 39 ) 40 41 func die(format string, v ...interface{}) { 42 fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...)) 43 os.Exit(1) 44 } 45 46 func sendName(sock mangos.Socket, name string) { 47 fmt.Printf("%s: SENDING \"%s\"\n", name, name) 48 if err := sock.Send([]byte(name)); err != nil { 49 die("failed sending: %s", err) 50 } 51 } 52 53 func recvName(sock mangos.Socket, name string) { 54 var msg []byte 55 var err error 56 if msg, err = sock.Recv(); err == nil { 57 fmt.Printf("%s: RECEIVED: \"%s\"\n", name, string(msg)) 58 } 59 } 60 61 func sendRecv(sock mangos.Socket, name string) { 62 for { 63 sock.SetOption(mangos.OptionRecvDeadline, 100*time.Millisecond) 64 recvName(sock, name) 65 time.Sleep(time.Second) 66 sendName(sock, name) 67 } 68 } 69 70 func node0(url string) { 71 var sock mangos.Socket 72 var err error 73 if sock, err = pair.NewSocket(); err != nil { 74 die("can't get new pair socket: %s", err) 75 } 76 if err = sock.Listen(url); err != nil { 77 die("can't listen on pair socket: %s", err.Error()) 78 } 79 sendRecv(sock, "node0") 80 } 81 82 func node1(url string) { 83 var sock mangos.Socket 84 var err error 85 86 if sock, err = pair.NewSocket(); err != nil { 87 die("can't get new pair socket: %s", err.Error()) 88 } 89 if err = sock.Dial(url); err != nil { 90 die("can't dial on pair socket: %s", err.Error()) 91 } 92 sendRecv(sock, "node1") 93 } 94 95 func main() { 96 if len(os.Args) > 2 && os.Args[1] == "node0" { 97 node0(os.Args[2]) 98 os.Exit(0) 99 } 100 if len(os.Args) > 2 && os.Args[1] == "node1" { 101 node1(os.Args[2]) 102 os.Exit(0) 103 } 104 fmt.Fprintf(os.Stderr, "Usage: pair node0|node1 <URL>\n") 105 os.Exit(1) 106 }