go - Golang unix sockets: registering same type for RPC on different sockets? -


i'm working in go , bit new working unix sockets. tried searching similar question, couldn't find anything, apologies if has been answered before.

i want use unix sockets simulate cluster of machines testing. i'm testing implementation of raft, want register multiple objects of same type (a hefty struct) on different unix sockets. looking @ simple example wrote, effect seems not want: dialing different sockets same exported method seems collapse on single port:

package main  import (     "net"     "fmt"     "net/rpc"     "log"     "sync" )  type server struct {     name string }  type speakargs struct { }  type speakreply struct {     success bool }  type addargs struct {     a, b int }  type addreply struct {     answer int     success bool }  func (s *server) add(args *addargs, reply *addreply) error {     reply.answer = args.a + args.b     reply.success = true     return nil }  func (s *server) speak(args *speakargs, reply *speakreply) error {     fmt.printf("my name %v.\n", s.name)     reply.success = true     return nil }  func main() {     var wgmain, wgregister, wgcall sync.waitgroup     wgmain.add(3)     wgregister.add(2)     wgcall.add(1)      go func() {         server := &server{name: "richard"}         rpc.register(server)         la, e := net.listen("unix", "/tmp/example1.sock")         if e != nil {             log.fatal("listen error:", e)         }         wgregister.done()         go rpc.accept(la)         wgcall.wait()         la.close()         wgmain.done()         fmt.println("server exited.")     }()      go func() {         server := &server{name: "benny"}         rpc.register(server)         lb, e := net.listen("unix", "/tmp/example2.sock")         if e != nil {             log.fatal("listen error:", e)         }         wgregister.done()         go rpc.accept(lb)         wgcall.wait()         lb.close()         wgmain.done()         fmt.println("server exited.")     }()      go func() {         wgregister.wait()         oneclient, err1 := rpc.dial("unix", "/tmp/example1.sock")         twoclient, err2 := rpc.dial("unix", "/tmp/example2.sock")         if err1 != nil {             log.fatal("listen error:", err1)         }         if err2 != nil {             log.fatal("listen error:", err2)         }          addargs := &addargs{1, 2}         addreply := &addreply{}         speakargs := &speakargs{}         speakreply := speakreply{}         oneclient.call("server.add", addargs, addreply)         oneclient.call("server.speak", speakargs, speakreply)         twoclient.call("server.speak", speakargs, speakreply)          fmt.printf("added numbers! %v + %v = %v.\n", addargs.a, addargs.b, addreply.answer)         wgcall.done()         oneclient.close()         twoclient.close()         wgmain.done()         fmt.println("client exited.")     }()     wgmain.wait() } 

i expect print both richard , benny in console when speak() called on different clients, instead prints 1 of them twice, seemingly randomly. there i'm missing here? example output, time richard seemed come out, benny.

my name richard. name richard. added numbers! 1 + 2 = 3. client exited. server exited. server exited. 

edit: fix pavlo strokov! rpc.register defaults defaultserver if not specified, both getting registered on same rpc server: correction call rpc.newserver() , register each server on one.

package main  import (     "net"     "fmt"     "net/rpc"     "log"     "sync" )  type server struct {     name string }  type speakargs struct { }  type speakreply struct {     success bool }  type addargs struct {     a, b int }  type addreply struct {     answer int     success bool }  func (s *server) add(args *addargs, reply *addreply) error {     reply.answer = args.a + args.b     reply.success = true     return nil }  func (s *server) speak(args *speakargs, reply *speakreply) error {     fmt.printf("my name %v.\n", s.name)     reply.success = true     return nil }  func main() {     var wgmain, wgregister, wgcall sync.waitgroup     wgmain.add(3)     wgregister.add(2)     wgcall.add(1)      go func() {         rpcserver := rpc.newserver()         server := &server{name: "richard"}         rpcserver.register(server)         la, e := net.listen("unix", "/tmp/example1.sock")         if e != nil {             log.fatal("listen error:", e)         }         wgregister.done()         go rpcserver.accept(la)         wgcall.wait()         la.close()         wgmain.done()         fmt.println("server exited.")     }()      go func() {         rpcserver := rpc.newserver()         server := &server{name: "benny"}         rpcserver.register(server)         lb, e := net.listen("unix", "/tmp/example2.sock")         if e != nil {             log.fatal("listen error:", e)         }         wgregister.done()         go rpcserver.accept(lb)         wgcall.wait()         lb.close()         wgmain.done()         fmt.println("server exited.")     }()      go func() {         wgregister.wait()         oneclient, err1 := rpc.dial("unix", "/tmp/example1.sock")         twoclient, err2 := rpc.dial("unix", "/tmp/example2.sock")         if err1 != nil {             log.fatal("listen error:", err1)         }         if err2 != nil {             log.fatal("listen error:", err2)         }          addargs := &addargs{1, 2}         addreply := &addreply{}         speakargs := &speakargs{}         speakreply := &speakreply{}         oneclient.call("server.add", addargs, addreply)         oneclient.call("server.speak", speakargs, speakreply)         twoclient.call("server.speak", speakargs, speakreply)          fmt.printf("added numbers! %v + %v = %v.\n", addargs.a, addargs.b, addreply.answer)         wgcall.done()         oneclient.close()         twoclient.close()         wgmain.done()         fmt.println("client exited.")     }()     wgmain.wait() } 

which prints

my name richard. name benny. added numbers! 1 + 2 = 3. client exited. server exited. server exited. 

i think because using defaultserver rpc server. instead should create different servers each: richard , benny. please take on code modified me work expected here: rpc calls on 1 machine


Comments

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -