package krpc import ( "fmt" "io" "reflect" "sync" "krwu.top/krpc.v1/codec" ) type request struct { h *codec.Header argv reflect.Value replyv reflect.Value } func (s *Server) readRequestHeader(cc codec.Codec) (*codec.Header, error) { var h codec.Header if err := cc.ReadHeader(&h); err != nil { if err != io.EOF && err != io.ErrUnexpectedEOF { fmt.Println("rpc server: read header error:", err) } return nil, err } return &h, nil } func (s *Server) readRequest(cc codec.Codec) (*request, error) { h, err := s.readRequestHeader(cc) if err != nil { fmt.Println("rpc server: read request error: ", err) return nil, err } req := &request{h: h} req.argv = reflect.New(reflect.TypeOf("")) if err = cc.ReadBody(req.argv.Interface()); err != nil { fmt.Println("rpc server: read argv err: ", err) } return req, nil } func (s *Server) handleRequest(cc codec.Codec, req *request, sending *sync.Mutex, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("rcp server: ", req.h, req.argv.Elem()) req.replyv = reflect.ValueOf(fmt.Sprintf("krpc resp %d", req.h.Seq)) s.sendResponse(cc, req.h, req.replyv.Interface(), sending) }