python套接字,无效的参数

fla*_*urn 2 python sockets macos python-2.7

我正在使用支持以太网的中继。试图通过套接字与 python 通信。我看到了非常有趣的行为,我认为这与设备无关。下面是失败的代码。我得到的错误是[Errno 22] Invalid argument

    self.ip_addr = <some address>
    self.port = <some port>
    self.max_attempt_cnt = <some count>
    self.sleep_interval = <some interval>
    try_cnt=0
    skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
    while True:
        try:
            skt.connect((self.ip_addr, int(self.port)))
            break
        except socket.error as e:
            try_cnt+=1
            if (self.max_attempt_cnt > 0) and (try_cnt > self.max_attempt_cnt):
                msg = 'Maximum connection attempt count of {} is exceeded'.format(
                        self.max_attempt_cnt
                        )
                raise ConnectionAttemptCountExceededError(msg)
            time.sleep(self.sleep_interval)

    <do stuff 0>
    <do stuff 1>
    <do stuff 2>
Run Code Online (Sandbox Code Playgroud)

如果我sktwhile循环内移动我的定义,即如下所示:

    while True:
        try:
            skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            skt.connect((self.ip_addr, int(self.port)))
            break
Run Code Online (Sandbox Code Playgroud)

问题消失。

我知道有一种不同的方式来编写这段代码,但这不是我要问的。

我的问题是为什么在循环外创建套接字时代码失败,为什么在循环内创建套接字时它会工作?

编辑

我意识到我没有提到这段代码确实适用于Windows,但它不适Mac用于我正在使用的机器。

J.J*_*ala 5

来自connectLinux (debian / Jessie) 附带的手册页

如果connect()失败,请将套接字的状态视为未指定。便携式应用程序应关闭套接字并创建一个新套接字以重新连接。

基于此,无效参数错误消息是指给定的文件描述符对应于未处于可用状态的套接字。