gpt4 book ai didi

c++ - 关闭 Boost 套接字的错误文件描述符

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:33 25 4
gpt4 key购买 nike

我正在使用 Boost 1.45 ASIO 处理在 Windows 和 Mac 上运行的应用程序中的一些套接字连接。在 Windows 上,以下代码不会导致任何错误,并且我的套接字已完全关闭。但是在 Mac 上,关机和(如果我将其注释掉)关闭函数都会给我“错误的文件描述符”错误。在我调用这段代码之前,套接字工作正常。但是一旦我调用关闭或关闭,我就会收到错误消息。知道会发生什么吗?

if(socket.is_open())
{
socket.shutdown(socket.both);
socket.close();
}

最佳答案

close 上的“Bad file descriptor”通常意味着描述符已经关闭。这通常是因为程序中某些完全不相关的部分存在双重关闭错误。

这样的错误可能会传染。如果您的程序两次关闭同一个描述符,并且在此期间它被重新分配,则第二次 close 将从它们下面关闭一些不相关的对象的描述符。然后,当该对象关闭其描述符时,它实际上可能正在关闭另一个对象的描述符……依此类推,直到最后一个对象出现“错误的文件描述符”错误。

这是 (a) 描述符是全局状态和 (b) Unix 要求任何对 open/socket/etc 的调用的副作用。分配编号最小的未使用描述符。

我知道调试它的唯一方法是使用像 strace(在 Linux 上)或 dtrace(在 Mac 上)这样的工具来监视所有文件描述符的创建和销毁). (好吧,也许不是唯一的方法。我曾经写过一个复杂的 LD_PRELOAD hack 来拦截对 openclose 的每次调用以找出哪个线程正在双重关闭他们的描述符,因为第二次关闭正在破坏另一个线程正在使用的描述符......)

祝你好运。

关于c++ - 关闭 Boost 套接字的错误文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com