如何在golang中关闭IPv6连接

时间:2018-01-19 09:02:12

标签: go

下面的代码是关于接受连接的tcpserver。运行一段时间后,系统中还剩下很多建立的IPv6连接

func (s *TCPServer) serve() {
    tcpaddr, err := net.ResolveTCPAddr("tcp", s.Addr)
    s.listener, err = net.ListenTCP("tcp", tcpaddr)
    for {
        conn, err := s.listener.AcceptTCP()
        if err != nil {
            return err
        }

        conn.SetReadBuffer(s.ReadBufferSize)
        conn.SetWriteBuffer(s.WriteBufferSize)

        s.wg.Add(1)
        go s.handle(conn)
    }
}

func (s *TCPServer) handle(conn net.Conn) {
    defer s.wg.Done()
    defer func() {
        conn.Close()
        fmt.Println("Conn Closed", conn.RemoteAddr())
    }()

    s.ClientHandler(conn, s.closed)
}

使用go1.8.1,在ubuntu 16.04下运行

我的问题是:

  1. 为什么IPv6连接未关闭?(使用lsof | grep program | grep -i IPv6显示大量已建立的IPv6连接。)
  2. 如何正确地从net.Conn关闭此listener.AcceptTCP()
  3. - 编辑 - 客户端处理程序将调用以下代码。

    func HandleClient(conn net.Conn, readDeadline, writeDeadline int, op *Config) {
    
        header := make([]byte, 2)
    
        for {
            conn.SetReadDeadline(time.Now().Add(time.Duration(readDeadline) * time.Second))
            conn.SetWriteDeadline(time.Now().Add(time.Duration(writeDeadline) * time.Second))
    
            n, err := io.ReadFull(conn, header)
            if err == io.EOF {
                return
            }
    
            if err != nil {
                return
            }
    
            size := binary.BigEndian.Uint16(header)
            payload := make([]byte, size)
            n, err = io.ReadFull(conn, payload)
            if err != nil {
                return
            }
    
            err = client.WriteIn(payload) // decode the content of the packet
            if err == ErrorKickedOut {
                return
            }
        }
    }
    

0 个答案:

没有答案