[gogf/gf]conn.SendRecvWithTimeout()无法收到返回值,请问下如何解决?

2024-06-25 14 views
5
    connections = gmap.New()
    connections是一个保存了conn的地图
    --------------------------------------------------
    conn := connections.Get(parkingNo)
if conn == nil {
    ResponseOK(c, "停车场未连接")
    return
}

    bytes := jsonutil.Marshal(request)
resBytes, err := conn.SendRecvWithTimeout(bytes, -1, 5*time.Second)
// 不会收到返回值,为什么
if err != nil {
    ResponseOK(c, err.Error())
    return
}

回答

8

@qq378488249 你获取到的resBytes变量的len是多少,errnil吗?

4

不会执行到下一行,会一直卡在这里,然后tcp_server会收到消息,但是这个conn不会收到消息

9

@qq378488249 你的意思是即使设置了超时时间到期了SendRecvWithTimeout仍未超时返回对吧?

1

抱歉,刚才理解错了,err不是nil,err里是timeout,因为无法收到数据

6

@qq378488249 errtimeout的话表示你设置的超时时间生效了,这个逻辑是对的。如果超时仍未收取到数据,请检查客户端是否连接成功,是否有发送数据,可以结合连接客户端的时间,以及连接状态判断来一起测试。

4

@qq378488249 另外SendRecvWithTimeout的长度参数一般不会设置为-1,在流量比较大的场景中获取全部缓冲区内容容易产生粘包/分包情况;一般是自定义TCP传输协议(数据格式),按照固定长度获取。