当前位置: 首页 > 知识库问答 >
问题:

关闭未释放文件描述符的套接字

步博厚
2023-03-14
ctsvr  9733 mike 1017u  sock     0,7      0t0 3323579 can't identify protocol
ctsvr  9733 mike 1018u  sock     0,7      0t0 3323581 can't identify protocol
...

有什么想法吗?

共有1个答案

劳嘉实
2023-03-14

所以使用strace(谢谢Gearoid),我不知道没有它我会怎么生活,我注意到我实际上是在关闭描述符。

然而。为了子孙后代,我揭露了我愚蠢的错误:

Socket::Socket() : impl(new Impl) {
    impl->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ....
}

Socket::ptr_t Socket::accept() {
    auto r = ::accept(impl->fd, NULL, NULL);
    ...
    ptr_t s(new Socket);
    s->impl->fd = r;
    return s;
}

正如您所看到的,我的构造函数立即分配了一个套接字,然后我用accept返回的描述符替换了这个描述符--创建了一个泄漏。我已经将accept代码从独立的Acceptor类重构为Socket类,而没有改变这一点。

 类似资料:
  • 问题内容: 我认为这个问题更多是“编码风格”,而不是技术问题。 说我有一行代码: 文件描述符会自动关闭还是留在内存中?如果文件描述符未关闭,则首选的关闭方式是什么? 问题答案: 如果将文件对象分配给变量,则可以使用来显式关闭它 另外,(也通常是首选),您可以使用Python文档中提到的关键字(Python 2.5及更高版本): 在处理文件对象时,最好使用关键字。这样做的好处 是 ,即使在执行过程中

  • 问题内容: 我正在尝试通过linux套接字发送一些文件描述符,但是它不起作用。我究竟做错了什么?应该如何调试这样的东西?我尝试将perror()放到所有可能的地方,但是他们声称一切正常。这是我写的: 问题答案: 史蒂文斯(etal)[UNIX®网络编程,第1卷:套接字网络API描述了在第15章 Unix域协议 (尤其是第15.7节:_传递描述_符)中的过程之间传输文件描述符的过程。对此进行完整描述

  • 我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前

  • 文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作

  • 文件描述符接口 函数 int  fd_new (void)   分配文件描述符   struct dfs_fd *  fd_get (int fd)   获取文件描述结构   void  fd_put (struct dfs_fd *fd)   放置文件描述符   int  fd_is_open (const char *pathname)   判断文件是否已被打开   int  select (

  • 问题内容: 我的代码是这样的: 它在第一次运行时效果很好,但之后每次都给我Errno 9。我究竟做错了什么? 顺便说一句, 问题答案: 您在关闭的同一套接字上调用。你不能那样做。 至于该文档的说: 套接字对象上所有以后的操作都将失败。 只需将(或您拥有的任何东西)移动到循环中即可。(或者,如果愿意的话,可以分两步使用而不是这样做,这更容易出错,也意味着您不必猜测IPv4与IPv6等)。