当前位置: 首页 > 面试题库 >

如何关闭被杀死程序打开的套接字?

西门马鲁
2023-03-14
问题内容

我有一个Python应用程序,该应用程序打开一个简单的TCP套接字以与单独主机上的另一个Python应用程序进行通信。有时程序会出错,或者我将直接杀死它,并且无论哪种情况,套接字都可能在未知的时间内保持打开状态。

下次我运行程序时,出现此错误:

socket.error: [Errno 98] Address already in use

现在,程序始终尝试使用相同的端口,因此看起来好像它仍处于打开状态。我检查了一下,很确定程序没有在后台运行,但是我的地址仍在使用中。

因此,如何手动(或以其他方式)关闭套接字/地址,以便我的程序可以立即重用它?

更新资料

根据Mike的回答,我检出了socket(7)页面并查看了SO_REUSEADDR:


     SO_REUSEADDR
         Indicates that the rules used in validating addresses supplied in a
 bind(2) call should
         allow reuse of local addresses.  For AF_INET sockets this means that
 a socket may bind,
         except when there is an active listening socket bound to the
 address.  When the listen‐
         ing  socket is bound to INADDR_ANY with a specific port then it is
 not possible to bind
         to this port for any local address.  Argument is an integer boolean
 flag.

问题答案:

假设您的套接字已命名s…您需要socket.SO_REUSEADDR在绑定到接口之前在服务器的套接字上进行设置…这将允许您立即重新启动TCP服务器…

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ADDR, PORT))


 类似资料:
  • 问题内容: 在生产环境中运行Express应用程序时,我想在服务器进程被杀死(即,发送SIGTERM或SIGINT)时正常关闭服务器。 这是我的代码的简化版本: 当我运行它并在浏览器中调用URL http:// localhost:3000 / 时,setInterval函数中的log语句将一直打印“当前打开1个连接”,直到我真正关闭浏览器窗口为止。显然,即使关闭选项卡也会使连接保持打开状态。 因

  • 我刚下载了Android Studio,所以所有的东西都是新安装的,但我一直在得到AVD的错误仿真程序被杀死,: null

  • 问题内容: 我正在使用popen()打开一个长期运行的过程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞直到子项完成。 我如何杀死这个过程?我没有找到任何简单的方法来从popen()返回的资源中获取pid,以便可以向其发送信号。 我想我可以做些杂乱的事情,并尝试使用某种命令行黑客将pid混入输出中… 问题答案: 好了,找到了一个解决方案:我改回而不是。然后就这么简单:

  • 我正在Java做一个应用程序,我需要它在后台工作,当用户关闭应用程序时,他仍然保持隐藏状态

  • 问题内容: 我试图在Sublime上为Node.js建立一个构建系统,所以我可以按F7键在打开的文件上调用“节点”。问题在于该过程将永远开放,因此,第二次使用F7时,我会获得一个加载项。 有没有办法可以杀死来自node.js的打开的“ node.exe”进程? 问题答案: 使用以下命令集来标识在给定端口上运行的进程并从命令行终止该进程 它将输出类似于以下所示的详细信息 然后使用 终止该过程。使用再

  • 我正在尝试为Node建立一个构建系统。js在sublime上,所以我可以按F7在打开的文件上调用“节点”。问题是,该过程将永远打开,因此,第二次使用F7时,我将使用一个外接程序。 有没有办法杀死node.js?打开的“node.exe”进程