相关疑难解决方法(0)

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

我有一个Python应用程序,它打开一个简单的TCP套接字,与另一个主机上的另一个Python应用程序通信.有时程序会出错或者我会直接杀死它,在任何一种情况下,套接字都可能会在未知时间内保持打开状态.

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

socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

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

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

更新

根据迈克的回答,我查看了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 …
Run Code Online (Sandbox Code Playgroud)

python sockets linux networking tcp

38
推荐指数
3
解决办法
4万
查看次数

SocketServer.ThreadingTCPServer - 程序重启后无法绑定到地址

作为无法绑定到地址后套接字程序崩溃的后续操作,我在重新启动程序后收到此错误:

socket.error:[Errno 98]地址已被使用

在这种特殊情况下,程序不是直接使用套接字,而是启动自己的线程TCP服务器:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

我该如何修复此错误消息?

python sockets linux tcpserver

10
推荐指数
2
解决办法
1万
查看次数

关闭后,直接在代码中再次使用ThreadingMixIn启动TCPServer.(给'地址已经在使用')

我尝试在Python中使用线程(ThreadingMixIn)编写TCPServer.问题是socket.error: [Errno 48] Address already in use当我尝试再次运行它时,我无法正常关闭它.这是触发问题的python代码的最小示例:

import socket
import threading
import SocketServer

class FakeNetio230aHandler(SocketServer.BaseRequestHandler):

    def send(self,message):
        self.request.send(message+N_LINE_ENDING)

    def handle(self):
        self.request.send("Hello\n")

class FakeNetio230a(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    def __init__(self, server_address, RequestHandlerClass):
        self.allow_reuse_address = True
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)

if __name__ == '__main__':
    for i in range(2):
        fake_server = FakeNetio230a(("", 1234), FakeNetio230aHandler)
        server_thread = threading.Thread(target=fake_server.serve_forever)
        server_thread.setDaemon(True)
        server_thread.start()
        # might add some client connection here
        fake_server.shutdown()
Run Code Online (Sandbox Code Playgroud)

所有主要代码应该是启动服务器,关闭它并再次运行它.但它会触发上述错误,因为套接字在第一次关闭后尚未释放.

我认为这个设置self.allow_reuse_address = True可以解决问题,但这不起作用.当python程序完成后,我可以立即再次运行它,它可以启动服务器一次(但不是两次).
然而,当我随机端口(更换问题了12341234+i为例),因为没有其他服务器监听该地址.

有一个类似的SO Q 从ThreadingTCPServer正常关闭,但解决方案(设置allow_reuse_addressTrue …

python sockets shutdown tcpserver

5
推荐指数
1
解决办法
6684
查看次数

标签 统计

python ×3

sockets ×3

linux ×2

tcpserver ×2

networking ×1

shutdown ×1

tcp ×1