Я не могу понять, как использовать функцию 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
.
Что я делаю неправильно? Как пользоваться? Как понять, действительно ли данные были записаны в порт? Как справиться с отключением?