我无法理解如何使用 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/