3

我有以下代码:

server := &http.Server{Addr: addr, Handler: r}

l, err := net.Listen("tcp", addr)
if err != nil {
    logging.Error("Failed opening socket: %s", err)
}

if err := server.Serve(l); err != nil {
    // error handling
}

l.Close()被调用时,server.Serve(l)将退出并出现错误。我想知道这是否真的是一个错误或只是有人打电话的结果l.Close()(这对我来说不是错误)。

有没有合适的方法来做到这一点?

4

2 回答 2

1

关于 TCP 套接字的一些 hack-ish 方式:

read_len, err := conn.Read(request)

if err != nil {

  if err.Error() == "use of closed network connection" { 
    // Do something when socket closed
    break
  }

if err.Error() == "use of closed network connection"if err := server.Serve(l); err != nil {, 或您的 TCP 处理程序函数中尝试。

于 2013-05-24T05:01:43.363 回答
0

使用实现的接口通常io.ReadWriteCloser会返回一个错误。implements ,所以我希望它也会返回这个错误,但不幸的是它不遵循这个约定。相反,它在 net.go 中返回一个私有声明的 errClosingio.EOFio.ErrUnexpectedEOFnet.Listenerio.Closer

返回的错误net.Listener包含在net.OpError. 这个结构有一些可能有用的附加信息——特别是“Op”和“Err”。“Op”告诉您错误发生的位置。当你执行时,Close() error你会得到“接受”。文档说你也可以得到“读”和“写”回来。

要获得net.OpError,您可以这样做:

err := server.Serve(l)
if opErr, ok := err.(*net.OpError); ok {
    // opErr.Op, opErr.Err, ...
}

或者像这样(假设net.Listener总是返回 a net.OpError):

err := server.Serve(l).(*net.OpError)

net.OptError.Err 返回原始错误,如果错误被导出,这将很有帮助。无论哪种方式,我都不建议检查字符串,因为这可能会在未来的版本中中断。最好将错误直接与您没有的导出错误进行比较。

net.OptErrorTemporary() bool声明了一个函数。该net/http使用它来重新建立连接以增加间隔。因此,在这种情况下,net/http我会假设返回的任何错误都是调用Close() error. 否则Temporary() bool将返回 true,这会net/http为您捕获。

于 2013-06-18T17:11:57.643 回答