Go net conn.SetWriteDeadline использование функции - PullRequest
0 голосов
/ 08 ноября 2018

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

1 Ответ

0 голосов
/ 08 ноября 2018

Ваша запись была принята стеком TCP, который теперь имеет свой собственный механизм для обработки попыток и сбоев.Срок записи не защищает от создаваемого вами условия.Если вы ожидаете ответа от партнера, с которым общаетесь, используйте крайний срок чтения.Если соединение прерывается одноранговым узлом, чтение или запись должны идентифицировать это условие с ошибкой.Простое отключение от сети не сделает это своевременным, но если используются тайм-ауты TCP, отключение в конечном итоге вызовет ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...