代码之家  ›  专栏  ›  技术社区  ›  Yoocee Ansah

当我尝试添加SSL身份验证时,“尝试在非套接字上执行操作”

  •  -1
  • Yoocee Ansah  · 技术社区  · 11 月前

    我创建了一个服务器,用于显示从客户端发送的数据。它最初起作用,但在我尝试包括SSL身份验证后停止了。当我尝试使用 wrap_socket() 作用

    import socket
    import json
    import ssl 
    
    HOST: str = '127.0.0.1'
    PORT: int = 5507
    
    def create_server_socket() -> socket.socket:
        """Creates a TCP socket, binds it to the host and port and listens for a connection. Will try again should the process fail"""
        try:
            server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server_socket.bind((HOST, PORT))
            server_socket.listen()
    
            print(f"SERVER LISTENING ON {HOST, PORT}")
            return server_socket
        except socket.error as message:
            print("Socket creation error: " + str(message) + "\n Retrying...")
            return create_server_socket()
    
    def main() -> None:
        """Main function to start the server."""
        context : ssl.SSLContext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)    
        context.load_cert_chain("ssl/server.crt", "ssl/server.key")
        server_socket: socket.socket = create_server_socket()
    
        context.wrap_socket(server_socket, server_side=True)
    
        client_socket, client_address = server_socket.accept()
        with client_socket:
            data: bytes = client_socket.recv(1024)
            print(f"{client_address} connected as {data.decode(encoding='utf-8')}\n")
            while True:
                data: bytes = client_socket.recv(1024)
                decoded_data: str = data.decode(encoding='utf-8')
                try:
                    data: dict =json.loads(decoded_data)
                except json.JSONDecodeError:
                    print(f"{client_address} disconnected!")
                    server_socket.close()
                    client_socket.close()
                    break
                print(f"{data['sender']}: {data['msg']}")
                
    
    if __name__ == '__main__':
        main()
    

    我收到以下错误:

    Traceback (most recent call last):
      File "c:\Users\Yoocee\Desktop\Algorithmic Sciences\server.py", line 82, in <module>
        main()
      File "c:\Users\Yoocee\Desktop\Algorithmic Sciences\server.py", line 57, in main
        client_socket, client_address = server_socket.accept()
                                        ^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\Yoocee\AppData\Local\Programs\Python\Python311\Lib\socket.py", line 294, in accept
        fd, addr = self._accept()
                   ^^^^^^^^^^^^^^
    OSError: [WinError 10038] An operation was attempted on something that is not a socket
    

    我做错了什么?我该如何解决?

    1 回复  |  直到 11 月前
        1
  •  0
  •   Steffen Ullrich    11 月前
    context.wrap_socket(server_socket, server_side=True)
    
    client_socket, client_address = server_socket.accept()
    

    根据 the documentation wrap_socket 包裹 “一个现有的Python套接字套接字和 返回SSLContext.sslsocket_class的实例 " 。不过您忽略了返回值。相反,你应该这样做

    server_socket = context.wrap_socket(server_socket, server_side=True)
    
    client_socket, client_address = server_socket.accept()
    

    您应该使用返回的套接字 包装袋 也可以从文档中的各种示例中看到。所以请使用文档,它非常好。