// listen for clients connections // this server needs to be running on a different port // than the Signer that is beneath it func (s *Server) Listen() error { dbg.Lvl3("Listening in server at", s.name) ln, err := net.Listen("tcp4", s.name) if err != nil { panic(err) } go func() { for { // dbg.Lvl4("LISTENING TO CLIENTS: %p", s) conn, err := ln.Accept() if err != nil { // handle error dbg.Lvl3("failed to accept connection") continue } c := coconet.NewTCPConnFromNet(conn) // dbg.Lvl4("CLIENT TCP CONNECTION SUCCESSFULLY ESTABLISHED:", c) if _, ok := s.Clients[c.Name()]; !ok { s.Clients[c.Name()] = c go func(c coconet.Conn) { for { tsm := TimeStampMessage{} err := c.Get(&tsm) if err != nil { log.Errorf("%p Failed to get from child:", s, err) s.Close() return } switch tsm.Type { default: log.Errorf("Message of unknown type: %v\n", tsm.Type) case StampRequestType: // dbg.Lvl4("RECEIVED STAMP REQUEST") s.mux.Lock() READING := s.READING s.Queue[READING] = append(s.Queue[READING], MustReplyMessage{Tsm: tsm, To: c.Name()}) s.mux.Unlock() } } }(c) } } }() return nil }
// listen for clients connections func (s *StampListener) ListenRequests() error { dbg.Lvl3("Setup StampListener on", s.NameL) global, _ := cliutils.GlobalBind(s.NameL) var err error s.Port, err = net.Listen("tcp4", global) if err != nil { panic(err) } go func() { for { dbg.Lvlf2("Listening to sign-requests: %p", s) conn, err := s.Port.Accept() if err != nil { // handle error dbg.Lvl3("failed to accept connection") select { case w := <-s.waitClose: dbg.Lvl3("Closing stamplistener:", w) return default: continue } } dbg.Lvl3("Waiting for connection") c := coconet.NewTCPConnFromNet(conn) if _, ok := s.Clients[c.Name()]; !ok { s.Clients[c.Name()] = c go func(co coconet.Conn) { for { tsm := TimeStampMessage{} err := co.GetData(&tsm) dbg.Lvlf2("Got data to sign %+v - %+v", tsm, tsm.Sreq) if err != nil { dbg.Lvlf1("%p Failed to get from child: %s", s.NameL, err) co.Close() return } switch tsm.Type { default: dbg.Lvlf1("Message of unknown type: %v\n", tsm.Type) case StampRequestType: s.Mux.Lock() s.Queue[READING] = append(s.Queue[READING], MustReplyMessage{Tsm: tsm, To: co.Name()}) s.Mux.Unlock() case StampClose: dbg.Lvl2("Closing connection") co.Close() return case StampExit: dbg.Lvl2("Exiting server upon request") os.Exit(-1) } } }(c) } } }() return nil }