Skip to content

In continuous Encode calls, the Decode peer receive zero value #207

@zhliner

Description

@zhliner
type Args struct {
	A, B int
}
type Request struct {
	ID     uint64
	Method string
}
// msgp EncodeMsg & DecodeMsg done.

client.go

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}
	ids := Request{1, "Arith.Divide"}
	args := Args{int('z'), int('a')}
	args2 := Args{int('x'), int('i')}

	msgp.Encode(conn, ids)
	// log.Println("hai")  // If this is valid, the server's result is ok.
	msgp.Encode(conn, args)
	msgp.Encode(conn, args2)
}

server.go

func main() {
	l, e := net.Listen("tcp", ":1234")
	if e != nil {
		log.Fatal("listen error:", e)
	}
	fmt.Println("start listen for client...")
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Print("rpcjs.Serve: accept:", err.Error())
			return
		}
		var req Request
		var arg Args
		var arg2 Args
		msgp.Decode(conn, &req)
		fmt.Println(req)

		msgp.Decode(conn, &arg)
		fmt.Println(arg)

		msgp.Decode(conn, &arg2)
		fmt.Println(arg2)
	}
}

// Output: client first run
{1 Arith.Divide}
{0 0} or {120 105} or {122 97}
{0 0}

// Output: client second run
{1 Arith.Divide}
{122 97}
{0 0}

why?
when the log.Println("hai") is valid, the calls is ok.
// Output:
{1 Arith.Divide}
{122 97}
{120 105}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions