2017-04-26 110 views
0

我正在使用ethernet enabled relay。嘗試通過套接字與python進行通信。我看到了非常有趣的行爲,我不認爲它與設備有關。以下是失敗的代碼。我得到的錯誤是[Errno 22] Invalid argumentpython socket,無效的參數

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 defition的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

它適用於我(Python 2.7,窗口),你可以包括追溯? –

+0

@ t.m.adam我應該提到它可以在Windows中工作,但我在Mac上運行我的代碼。 – flashburn

+0

所以這顯然是一個操作系統。你有沒有試過Linux? –

回答

1

connect手冊頁附帶於Linux(Debian /傑西)

如果connect()失敗,考慮插座爲未指定狀態。 便攜式應用程序應關閉套接字併爲 重新連接創建一個新套接字。

基於此,無效參數錯誤消息引用給定文件描述符,該文件描述符對應於不處於可用狀態的套接字。