【问题标题】:socket.accept() returns invalid argument when run inside a classsocket.accept() 在类中运行时返回无效参数
【发布时间】:2020-01-02 03:09:40
【问题描述】:

这是我第一次尝试使用 python 自定义游戏/界面。我已经开始从控制器连接到游戏服务器所需的通信。我想让通信成为一个对象,以便我可以在游戏中调用它。我遇到的问题是,当我调用 server.serverRun() 时,我得到一个异常 OSError: [WinError 10022] An invalid argument was provided。现在,当在对象之外时,这一切都运行良好。我不确定我错过了什么。

'''

#game.py
import math,random,sys,time,os
import comm

serverStatus = False

while True:
    server = comm.server()
    if serverStatus == False:
        serverStatus = server.serverStart("127.0.0.1",1234)
    else:
        server.serverRun()



#comm.py
import os,socket,pickle,select

class server():

    HeaderLength = 10
    GameStatus = {"state": 0, "Sound" : 0}

    def __init__(self):
        self.clients = {}
        self.clientSocket = ""
        self.clientAddress = ("",0)
        # Create a socket
        # socket.AF_INET - address family, IPv4, some other possible are AF_INET6, AF_BLUETOOTH, AF_UNIX
        # socket.SOCK_STREAM - TCP, conection-based, socket.SOCK_DGRAM - UDP, connectionless, datagrams, socket.SOCK_RAW - raw IP packets
        self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # SO_ - socket option
        # SOL_ - socket option level
        # Sets REUSEADDR (as a socket option) to 1 on socket
        self.serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    def serverStart(self,IP,PORT):
        try:

            # Bind, so server informs operating system that it's going to use given IP and port
            # For a server using 0.0.0.0 means to listen on all available interfaces, useful to connect locally to 127.0.0.1 and remotely to LAN interface IP
            self.serverSocket.bind((IP, PORT))

            # This makes server listen to new connections
            self.serverSocket.listen(5)
            print (f"IP Adddress: {IP}")
            print (f"Port #: {PORT}")
            return True

        except:
            print ("Connection Error")
            return False

    def serverRun(self):
        self.clientSocket, self.clientAddress = self.serverSocket.accept()
        print(f"Address {self.clientAddress}")

'''

【问题讨论】:

    标签: python sockets


    【解决方案1】:
    while True:
        server = comm.server()
        if serverStatus == False:
            serverStatus = server.serverStart("127.0.0.1",1234)
        else:
            server.serverRun()
    

    您使用server = comm.server() 为循环的每次迭代创建一个新套接字。 但是您只在第一次迭代中绑定+侦听服务器套接字。 这意味着在第二次迭代中,您有一个未绑定且未准备好监听的新套接字,但您对其调用了 accept。

    即第一次迭代:

    server = comm.server()    # creates new socket for listener
    # calls bind + listen
    serverStatus = server.serverStart("127.0.0.1",1234)
    

    第二次迭代

    server = comm.server()       # creates new socket for listener
    # calls accept on this new socket without calling bind+listen before -> Error
    server.serverRun()
    

    您应该执行以下操作,而不是创建这个奇怪的 while 循环:

    server = comm.server()                  # creates socket - only once
    server.serverStart("127.0.0.1",1234)    # calls bind+listen - only once too
    while True:
        server.serverRun()                  # calls accept - for every new connection
    

    【讨论】:

    • 谢谢。我完全错过了我在循环中声明 com.server 的情况。在循环之前将其移出,它可以正常工作。 If else 的原因是告诉我服务器正在监听。我在想它可能需要用于错误处理。
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多