2017-08-24 10 views
0

私は次のサンプルコードを読んで、connect()がEINPROGRESSまたはEALREADY以外のもので失敗する可能性があるプラットフォームが誰かが言うことができるかどうか疑問に思っています。O_NONBLOCKソケットのconnect()がEINPROGRESSまたはEALREADY以外のものと失敗することはありますか?

失敗すると、実行するサンプルのelseブランチを実行することを意味します。ソースのコメントはFreeBSDを示唆しています。他のシステムはありますか?私はそれをLinuxで失敗させることができませんでした。

 if (connect(hostp->sockets[i], 
      (struct sockaddr *)res->ai_addr, 
      res->ai_addrlen) == -1) { 
      /* This is what we expect. */ 
      if (errno == EINPROGRESS) { 
       printf(" connect EINPROGRESS OK " 
        "(expected)\n"); 
       FD_SET(hostp->sockets[i], &wrfds); 
      } else { 
       /* 
       * This may happen right here, on 
       * localhost for example (immediate 
       * connection refused). 
       * I can see that happen on FreeBSD 
       * but not on Solaris, for example. 
       */ 
       printf(" connect: %s\n", 
        strerror(errno)); 
       ++n; 
      } 
     [...] 

ソース:http://mff.devnull.cz/pvu/src/tcp/non-blocking-connect.c

答えて

2

接続が失敗する理由は、多くの方法があります。コメントには、リッスンするサーバーがない場合にローカルホストに接続する際に、非ブロッキング接続であっても一部のプラットフォームですぐに障害が発生する可能性があることが正しく述べられています。また、デフォルトルートのインターフェイスがダウンしている場合など、ターゲットにルートが決まらない場合は通常、すぐに接続が失敗します。そして、メモリ不足や、サンドボックス内などを走っているときに接続することを拒否されたアクセス権など、他の方法では失敗する可能性があります。

+0

インターフェイスがダウンしていると期待しています。私はこれを次に試みます。 (私は、これらの失敗を正しく処理しないと思うコードを扱っています。実際の再生手順を書き留めて、ファイル記述子がリークするようにしたいと思います。 – user7610

+0

私はそれを失敗させる(またはそのことに関しては成功する)ことができませんでした。私はlinux、freebsd、openindiana(半心)を試みました。それでも、コード内の可能性を扱うことは間違いなくバグです。 – user7610

関連する問題