2017-04-26 23 views
0

私はethernet enabled relayで作業しています。ソケットを介してPythonと通信しようとしています。私は非常に興味深い動作を見ていると私はそれがデバイスに関連しているとは思わない。以下は失敗するコードです。pythonソケット、無効な引数

while True: 
     try: 
      skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      skt.connect((self.ip_addr, int(self.port))) 
      break 

問題が消える:私はすなわち、以下のように、whileループ内sktの私のdefitionを移動した場合、私は取得していますエラーが[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> 

です。

私はこのコードを書く別の方法があることを知っていますが、それは私が求めているものではありません。

私の質問は、ループの外側にソケットを作成したときにコードが失敗する理由と、ループ内でソケットが作成されたときになぜ機能するのかです。私はこのコードがWindowsに作業を行うことに言及しなかったが、それは私が使用しているものですMacマシン上で動作しないことに気づい

EDIT

+0

私にとってはうまくいきます(python 2.7、windows)、トレースバックを含めることはできますか? –

+0

@ t.m.adam Windowsで動作すると言わざるを得ないが、Mac上でコードを実行している。 – flashburn

+0

それは明らかにOSのことです。あなたはLinuxを試しましたか? –

答えて

1

のLinux(Debianの/ジェシー)が付属していますconnect manページconnect()が失敗した場合

から、指定されていないとして、ソケットの状態を考慮してください。 ポータブルアプリケーションは、ソケットを閉じて、 を再接続するために新しいソケットを作成する必要があります。

これに基づいて、無効な引数エラーメッセージは、使用可能な状態にないソケットに対応する、指定されたファイルディスクリプタを参照します。