如何在"杀死PID"后将套接字服务器从"busy"状态中删除?



我有一个简单的套接字服务器设置,可以将一些数字发送给Intranet中的客户端。测试时,我停止终端( ctrl c (的server.py脚本,该脚本后来在我尝试到达同一页面时在Safari中导致忙碌的服务器错误。

我看到了这个服务器错误问题,但问题是:

  1. 我找不到/etc/init.d/networking restart文件。我正在使用Mac,这是用于Linux。对于我测试服务器的每次,这也是一个过度杀伤。每小时至少10次。

  2. 在代码中插入选项SO_REUSEADDR确实有助于Address already in use,但我认为我的服务器已上升,但处于繁忙状态。使用此处的答案,我已经对此编辑了代码

host = <my machine address>  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port = 8080
s.bind((host, port))

我在服务器上会进行哪些更改以删除Safari中的此错误?

Safari 无法打开页面" my-ip",因为服务器意外地删除了连接。当服务器繁忙时,有时会发生这种情况。等待几分钟,然后再试一次。

lsof -i:8080的输出,停止脚本后

python3.7 11881 <user>    3u  IPv4 <Device>   0t0  TCP <my machine address>?:http-alt (LISTEN)

我做了kill 11881,然后重新运行代码,但在Safari中获得了相同的消息。

netstat -na | grep "8080"的输出是

tcp4       0      0  <my machine address>.8080     *.*    LISTEN    

当脚本运行时,当我 KeyboardInterrupt时什么都没有。

firefox 暂时显示页面,然后显示错误页面

连接重置

chrome 仅显示一个空页面。

更新:它在Python 2.7中起作用,但在3.5中不起作用。代码的差异是:

c.send('n')

2.7和

c.send(bytes('n'.encode('utf-8')))

在3.5中

c

c, (client_host, client_port) = s.accept()

休息都是相同的。

我意外评论了一行

c.recv(1000)

问题中提到了c

当我将其与同一文件的较旧版本进行比较时,我发现了它。

最新更新