V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
FreeWong
V2EX  ›  问与答

Go TCPConn.Write 方法

  •  
  •   FreeWong · 2021-11-23 08:48:43 +08:00 · 1217 次点击
    这是一个创建于 1100 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设这里的代码是客户端
    ```
    tcpConn.SetWriteDeadline(time.Now().Add(5 * time.Second))
    n, err = tcpConn.Write([]byte(data))
    if err != nil {
    log.Println("写到缓冲区时错误", err)
    return
    }
    ```
    前提,客户端和服务端定义严格的自定义通讯格式如下 前 4 个字节表示后面所有数据的长度 后跟内容 如上代码 如果五秒后超时后,返回的 n 是已经发送到缓冲区中的字节数,如果我一共要发送 64 个字节,但是这个返回的 n 是 3,则还有 61 个字节未发送,同时 3 个字节已经在缓冲区,此时该怎么办?

    这 3 个节操作系统还是发送到对端,服务端收到一段不完整的数据 同时,好像 tcpconn 也没有清空发送缓冲区的方法 即使有 清空缓冲区的话 也会将原来处在缓冲区中的以前的完整的数据清空掉 ,这样也不合理.

    你们怎么处理这种情况呢 感谢
    6 条回复    2021-11-29 14:12:33 +08:00
    joesonw
        1
    joesonw  
       2021-11-23 09:55:06 +08:00
    Write 失败一般直接 Close 掉
    sujin190
        2
    sujin190  
       2021-11-23 10:05:57 +08:00
    所以服务端先循环读直到读取到 4 个字节解析出长度,然后再循环读直到读取到前面解析出的长度为止啊,客户端也是,没写全,就循环写后续数据就是了,做个切片就可以取出剩下的数据就是了,而且 go 的 write 缓冲区满了是阻塞写的
    zhangsanfeng2012
        3
    zhangsanfeng2012  
       2021-11-23 10:52:41 +08:00
    错包丢掉就可以了吧
    fuis
        4
    fuis  
       2021-11-23 14:48:30 +08:00
    Write 失败一般直接 Close 掉
    cppc
        5
    cppc  
       2021-11-23 18:08:57 +08:00 via iPhone
    一般做法不是无脑发数据,要 socket 可写才发,服务端消费不了你发不出去。
    FreeWong
        6
    FreeWong  
    OP
       2021-11-29 14:12:33 +08:00
    @cppc @zhangsanfeng2012 @fuis 已经在缓冲区中的怎么办?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3530 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:53 · PVG 12:53 · LAX 20:53 · JFK 23:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.