golang Tcp连接重用使EOF处于读取状态

时间:2019-05-22 12:33:08

标签: go tcp

我已经编写了一个代码,使用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连接?

0 个答案:

没有答案