Python TCP服务器在调用套接字时抛出OSError:[WinError 10057]。关机(1)

Python TCP服务器在调用套接字时抛出OSError:[WinError 10057]。关机(1),python,sockets,tcp,Python,Sockets,Tcp,我有一个相当复杂的TCP/IP服务器,它连接到多个客户端。我遇到了一个问题,我的客户端没有被更新,套接字正在关闭。我认为我需要同时调用socket.shutdown()和socket.close(),以便能够向所有客户端发送服务器关闭通知。但是,每当调用socket.shutdown()时,都会出现操作系统错误 有人知道为什么会这样吗?还是关闭套接字的其他方法,同时仍向所有连接的客户端发送通知?在调用socket.close()之前,我总是可以编写一个自定义命令来重置所有客户端,但我的服务器似乎

我有一个相当复杂的TCP/IP服务器,它连接到多个客户端。我遇到了一个问题,我的客户端没有被更新,套接字正在关闭。我认为我需要同时调用socket.shutdown()和socket.close(),以便能够向所有客户端发送服务器关闭通知。但是,每当调用socket.shutdown()时,都会出现操作系统错误

有人知道为什么会这样吗?还是关闭套接字的其他方法,同时仍向所有连接的客户端发送通知?在调用socket.close()之前,我总是可以编写一个自定义命令来重置所有客户端,但我的服务器似乎出了问题。下面是最小可复制示例

import socket
import selectors

class server_test:

    host = ''
    port = 12345

    sel = selectors.DefaultSelector()

    def __init__(self):
        self.start_server()
        self.stop_server()

    #Server Functions    
    def start_server(self):        
        self.lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.lsock.bind((self.host, self.port))
        self.lsock.listen()
        print("Server starting, listening on ",. (self.host, self.port))
        self.lsock.setblocking(False)
        self.sel.register(self.lsock, selectors.EVENT_READ, data=None)


    def stop_server(self):
        print("Shutting server down")
        self.lsock.shutdown(1)
        self.lsock.close()
我认为我需要同时调用socket.shutdown()和socket.close(),以便能够向所有客户端发送服务器关闭通知

否。
关闭(1)
在连接的插座上会向对等方发送FIN,以表示本地系统不会发送更多数据,但实际上可能会接受更多数据。
关闭(0)
将停止本地接收数据并拒绝对等方发送的任何数据。
close()
基本上结合了
关闭(1)
关闭(0)

您正试图告诉
self.lsock
的对等方您将不再发送数据。但是,
self.lsock
是本地侦听器套接字,它本身没有连接,因此没有对等方。由于您试图在未连接的套接字上执行需要连接的套接字的操作(仅侦听),因此将导致错误“…套接字未连接…”

如果要关闭与所有客户端的连接,实际上必须在所有连接的套接字上调用
shutdown
close
(即来自
self.lsock.accept()),而不是在侦听器套接字上调用

import socket
import selectors

class server_test:

    host = ''
    port = 12345

    sel = selectors.DefaultSelector()

    def __init__(self):
        self.start_server()
        self.stop_server()

    #Server Functions    
    def start_server(self):        
        self.lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.lsock.bind((self.host, self.port))
        self.lsock.listen()
        print("Server starting, listening on ",. (self.host, self.port))
        self.lsock.setblocking(False)
        self.sel.register(self.lsock, selectors.EVENT_READ, data=None)


    def stop_server(self):
        print("Shutting server down")
        self.lsock.shutdown(1)
        self.lsock.close()
    self.lsock.listen()
    ...
    self.lsock.shutdown(1)