私はposixを作成して接続するiPadアプリを持っていますsocket
。 connect(...)
へのコールは、リモートデバイスが接続試行を拒否したときに、期待どおりに応答していません。ピアリセット後でも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
が返され、errno
がETIMEDOUT
になります。サーバが接続の試行を拒否した場合、ドキュメントから
、私はECONNREFUSED
または多分ECONNRESET
する-1
とerrno
のために返すようにconnect()
を期待します。代わりにconnect()
は0
を返します。
私はTCPの会話を複数回WireSharkedてきたとしか二つのパケットで構成されていることを確認することができます
クライアント(アプリ) - >サーバー:
SYN, ACK
サーバー - >クライアント(アプリ) :
RST, ACK
なぜ接続が0
を返すのですか?
更新:異なるクライアントから同じサーバーに接続しています。 WindowsのQt(winsock?)またはMac OSX(POSIXも)は期待通りに動作します。つまりconnect()
は-1
、ECONNREFUSED
を返します。これは、それがサーバーの終わりよりむしろiPadの終わりの問題だと私に信じさせる。
'拒否するために'がtcp/ip接続設定のよく定義されたアクションintermsであるかどうか確信していないので、あなたがそれをどのように定義するかについて詳しく説明したいかもしれません。 – alk
「拒否された接続」とは、上記のようなTCP会話を持つものです。すなわち、クライアントは 'SYN'を試み、サーバーは' RST'を返します。これを説明するためにどのような用語を使用しますか? – sjwarner
iPadのSYNへのリモート接続からの 'SYN-ACK'はありませんか? – alk