【问题标题】:python socket, invalid argumentpython套接字,无效参数
【发布时间】:2017-04-26 20:24:19
【问题描述】:

我正在使用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 机器。

【问题讨论】:

  • 它对我来说很好用(python 2.7,windows),你能包括回溯吗?
  • @t.m.adam 我应该提到它确实在 Windows 中工作,但我在 Mac 上运行我的代码。
  • 所以这显然是一个操作系统的事情。你试过linux吗?
  • @t.m.adam 与 OSX 相同。 Windows 以不同的方式实现套接字。 Linux 和 OSX 匹配是有道理的。
  • 这超出了我的知识范围,我在 debian 上对其进行了测试,它工作正常。在 win 和 linux 上,我尝试在 localhost:80 上连接 apache 并打开/关闭它,它在任何情况下都按预期工作。你能发布完整的代码和回溯吗?

标签: python macos python-2.7 sockets


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!调试需要我一个小时!
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2011-10-05
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多