我正在使用ethernet enabled relay。试图通过套接字与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>
如果我在skt
循环中移动while
的定义,如下所示:
while True:
try:
skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
skt.connect((self.ip_addr, int(self.port)))
break
问题消失了。
我知道编写此代码有不同的方式,但这不是我所要求的。
我的问题是为什么在循环外部创建套接字时代码失败以及为什么它在循环内创建套接字时有效?
修改
我意识到我没有提到此代码适用于Windows
,但它并不适用于Mac
机器,这就是我所做的使用
答案 0 :(得分:3)
来自Linux附带的connect
手册页(debian / Jessie)
如果
connect()
失败,请将套接字的状态视为未指定。 便携式应用程序应关闭套接字并为其创建一个新套接字 重新连接。
基于此,无效参数错误消息引用与不处于可用状态的套接字对应的给定文件描述符。