2013-09-02 3 views
7

私はposixを作成して接続するiPadアプリを持っていますsocketconnect(...)へのコールは、リモートデバイスが接続試行を拒否したときに、期待どおりに応答していません。ピアリセット後でも0を返すsocket connect()

Iはsocketを作成して接続しています方法の簡単な例:ほとんどの場合

struct sockaddr_in server; 
server.sin_family = AF_INET; 

int socket = socket(AF_INET, SOCK_STREAM, 0); 
if(socket < 0) 
{ 
    NSLog(@"socket create failed: %s", strerror(errno)); 
} 
else if(inet_aton(mAddress, &server.sin_addr)) 
{ 
    server.sin_port = htons(mPortNumber); 
    if(connect(socket, (struct sockaddr *)&server, sizeof(server)) == -1) 
    { 
    NSLog(@"connect() failed: %s", strerror(errno)); 
    } 
    else 
    { 
    NSLog(@"connect() succeeded"); 
    } 
} 

を、上記の例では動作します。例えば接続を受け入れるリモートデバイス(以下、「サーバー」と呼びます)については、connect()が期待通りに0を返します。存在しないアドレスの場合、しばらくの間connect()ブロックが返され、-1が返され、errnoETIMEDOUTになります。サーバが接続の試行を拒否した場合、ドキュメントから

、私はECONNREFUSEDまたは多分ECONNRESETする-1errnoのために返すようにconnect()を期待します。代わりにconnect()0を返します。

私はTCPの会話を複数回WireSharkedてきたとしか二つのパケットで構成されていることを確認することができます

クライアント(アプリ) - >サーバー:SYN, ACK

サーバー - >クライアント(アプリ) :RST, ACK

なぜ接続が0を返すのですか?

更新:異なるクライアントから同じサーバーに接続しています。 WindowsのQt(winsock?)またはMac OSX(POSIXも)は期待通りに動作します。つまりconnect()-1ECONNREFUSEDを返します。これは、それがサーバーの終わりよりむしろiPadの終わりの問題だと私に信じさせる。

+0

'拒否するために'がtcp/ip接続設定のよく定義されたアクションintermsであるかどうか確信していないので、あなたがそれをどのように定義するかについて詳しく説明したいかもしれません。 – alk

+0

「拒否された接続」とは、上記のようなTCP会話を持つものです。すなわち、クライアントは 'SYN'を試み、サーバーは' RST'を返します。これを説明するためにどのような用語を使用しますか? – sjwarner

+0

iPadのSYNへのリモート接続からの 'SYN-ACK'はありませんか? – alk

答えて

1

私はあなたがこのようなソケットを作成する必要があると思います、3番目のパラメータに注意してください。

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

接続が拒否された場合、connect()は0を返します。これを考えてみましょう:connect()が成功し、tcp接続が確立され、呼び出しが0を返すとしましょう。しかし、サーバーは直ちにリセットまたは切断してからコードを変更してソケットでwriteまたはreadを呼び出します。次の書き込みはEPIPEで失敗し、読み取りは0を返します。 とにかくこのケースを処理する必要があります。

私はあなたがこれを読んだと仮定しますが、iOS版でPOSIXソケットを使用してより多くの警告であることに注意してください:私は、「リモートデバイスは、* ...接続の試みを拒否した場合* ...」https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html

関連する問題