我已经编写了一个代码,使用Dialer.Dial(“ tcp”,“ 8.8.8.8:53”)创建一个tcp连接池。 当我得到一个连接来编写dns查询并读取响应时,它显示EOF出现读取错误。
从客户端到8.8.8.8的所有tcp连接都处于close_wait状态。
我尝试删除设置的读写期限。我试图添加keep_alive计时器以保持建立的TCP连接。但是,似乎没有任何作用。
type tcpConn map[string][]net.Conn
const MaxConnections 20
func main() {
address := "8.8.8.8:53"
dialer := net.Dialer{}
dialer.Deadline = time.Time{}
if tcpConn == nil {
tcpConn = make(map[string][]net.Conn)
}
for i := 0; i < MaxConnections; i++ {
conn, err := dialer.Dial("tcp", address)
if err != nil {
return err
}
tcpConn[address] = append(tcpConn[address], conn)
}
var conn net.Conn
if len(tcpConn[address]) > 0 {
// Get the first free connection in the pool
conn = tcpConn[address][0]
if len(tcpConn[address]) > 1 {
tcpConn[address] = tcpConn[address][1:]
}
}
defer tcpConn[address] = append(tcpConn[address], conn)
// Write dns packet using conn
// Read dns packet using conn
// Send response
}
我希望它可以重用所有tcp连接。我在读取dns响应时遇到问题,因为它在1秒后返回EOF。
netstat -an | grep tcp显示所有连接处于close_wait状态。
如何在此处重用tcp连接?