下面的代码是关于接受连接的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下运行
我的问题是:
lsof | grep program | grep -i IPv6
显示大量已建立的IPv6连接。)net.Conn
关闭此listener.AcceptTCP()
?- 编辑 - 客户端处理程序将调用以下代码。
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
}
}
}