Я пытаюсь реализовать с помощью SetDeadline() неблокирующая Accept()
и лучшее, что я пришел до сих пор является следующий фрагмент кода (это рабочая программа v1.6.2 Go):Настройка тайм-аут для TCP слушателя
package main
import (
"net"
"log"
"time"
)
func createClient() {
tcpConn, err := net.DialTCP("tcp4", nil, &net.TCPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 12819,
})
if err != nil {
log.Fatalln("Error connecting to the server!")
}
log.Println("Managed to dial!")
tcpConn.Close()
}
func main() {
go createClient()
l, err := net.ListenTCP("tcp4", &net.TCPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 12819,
})
if err != nil {
log.Fatalln("Can't listen on provided IP/port!")
}
defer l.Close()
if err = l.SetDeadline(time.Now().Add(time.Nanosecond)); err != nil {
log.Fatalln("Can't set appropriate deadline!")
}
tcpConn, err := l.AcceptTCP()
if err != nil {
if opError, ok := err.(*net.OpError); ok && opError.Timeout() {
log.Fatalln("Timeout error!")
}
log.Fatalln("Error while accepting connection!")
}
log.Println("Accepted new connection!")
tcpConn.Close()
}
Проблема в том, что я всегда получаю Timeout error!
. Насколько я понимаю, это потому, что по вызову получателя времени AcceptTCP()
будет указан ранее установленный крайний срок. Попробуйте изменить его на time.Microsecond
, и вы, вероятно, получите тот же результат (если у вас нет процессора медленнее, чем у меня). Вещи начинают меняться только тогда, когда крайний срок получает не менее time.Second
. Вот когда я начинаю получать Accepted new connection!
/Managed to dial!
.
Поэтому я думаю, что я прибил проблему. Есть предположения?
Если вы хотите использовать 'select' use' syscall.Select', но это почти всегда неправильный способ сделать это в Go – JimB