go net conn.SetWriteDeadline函数用法

标签 go network-programming

我无法理解如何使用 net conn.SetWriteDeadline 函数?

conn, err := net.DialTimeout("tcp", "10.1.10.1:2000", 3*time.Second)
    if err!=nil{
        fmt.Println("Error: ", err)
    }
//waits as expected 3 seconds and returns error if dial not succeeded

conn.SetWriteDeadline(time.Now().Add(5*time.Second))
    n, err:= conn.Write([]byte{0x00})

    if err != nil {
        fmt.Printf("Write: %v", err)
    }

    fmt.Println("Bytes wrote: ", n)
//always returns n=1, no wait, no error if connection lost.

我希望 conn.Write 必须在 5 秒内尝试将数据写入端口,然后它必须返回 n=0 并在连接出现问题时返回错误.但是,即使我拔掉网线,它也不会返回任何错误和 n=1

如果我尝试做这样的事情,

for {
        conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
        n, err = conn.Write(buffer)
        if err != nil {
            log.Println("Timeout error")            
        } else {
            break
        }
        if t.GetElapsed() >= 30*time.Second {
            err = errors.New("Connection timeout")
            break
        }
    }

我预计会有多次写入数据的尝试,如果成功则从 FOR 转义,或者通过超时。但行为是一样的——即使网络断开,也没有错误,只有 1 迭代。 我究竟做错了什么?如何使用?如何判断数据是否真的写入了端口?如何处理掉线?

最佳答案

您的写入已被 TCP 堆栈接受,它现在有自己的机制来处理重试和失败。写入截止日期不能防止您正在创建的条件。如果您期待与您通信的同行的回应,请使用阅读截止日期。如果连接被对等端终止,则读取或写入都应将此情况标识为错误。简单地断开网络连接不会使这种情况及时发生,但它使用了 TCP 超时,断开连接最终会触发错误。

关于go net conn.SetWriteDeadline函数用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53208908/

相关文章:

sockets - 带宽限制(例如ipfw)如何工作?

c - 服务器程序卡在 read() 函数上,但 write() 函数在客户端程序中运行良好

java - 如何用java创建一个聊天客户端

mongodb - MapReduce 中的 Golang GlobalSign mgo 查询

go - 提交 `vendor` 目录是最佳实践吗?

c - 在 cgo、golang 中使用 free 时获得双重释放或损坏(out)

c - 编写网络协议(protocol)

golang cgo : libevent handler values are set to null during execution

angular - Angular 如何使用 Golang 和 websockets 管理 URL?

c - 网络编程常用的函数/代码片段有哪些?