1

次のコードを使用して、.NET サーバーからの応答をキャッチしようとしています。

telnet テストを実行すると動作します (応答が得られます)。しかし、このコードを使用すると、応答がありません。

-(IBAction)connectClicked:(id)sender {
    if (![socket connectToHost:@"192.168.100.192" onPort:1337 error:nil]) {
        NSLog(@"connection failed");
    }    
}

-(IBAction)fireClicked:(id)sender {
    NSString *welcomeMsg = @"GetId";
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];
    [socket writeData:welcomeData withTimeout:-1 tag:0];
    NSLog(@"message sent!");
}

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString*)host port:(UInt16)port {
    NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu", sock, host, port);
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
}

-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag {
    NSLog(@"onSocket:%p didReadData:%i", tag);    
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
    NSLog(@"onSocket:didWriteDataWithTag:%i", tag);    
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
}

サーバーとの接続は確立され、サーバーに情報を送信できますが、応答がありません。

これは私がログに記録したものです。

2011-03-21 10:00:32.424 CtC[33521:207] onSocket:0x4c3ebc0 didConnectToHost:192.168.100.192 port:1337
2011-03-21 10:00:35.846 CtC[33521:207] message sent!

返信が届かないのはなぜですか?

4

3 に答える 3

2

私も同じ問題を抱えています。サーバーはコマンドがいつ終了したかわからないため、データを書き込むときに「入力」ボタンをシミュレートしました。

だからこの行

NSString *welcomeMsg = @"GetId"; 

なるべき

NSString *welcomeMsg = @"GetId\r\n";

今はうまくいきました。

于 2011-03-21T12:23:15.283 に答える
1

コード スニペットが不十分なため、何が問題になるかはわかりません。しかし、それが私が続ける方法です:

  1. ホストに接続したときにエラーが発生しないことを確認します
  2. fireClicked メソッドで、ソケットが適切に開始されていることを確認してください
  3. didConnectToHost メソッドをオーバーライドし、NSLog ステートメントを追加して、接続したかどうかを確認してください。
  4. 変数「socket」の代わりに、didReadData および didWriteDataWithTag 内で指定されたソケット「sock」を使用します。
  5. 取得するログ ステートメントを教えてください
  6. ソケットの作成方法とホストへの接続方法を教えてください。

お役に立てば幸いです - アンディ

于 2011-03-20T02:07:02.707 に答える
0

このような状況では、WireShark が常に役立ちます。telnet とアプリを簡単に比較すると、違いがわかる場合があります。

とにかく書き込み後にこれを呼び出すため、didConnectToHost にある「readDataWithTimeout」を削除してみてください。
読み取りのタイムアウトを引き起こしている切断が発生しているのではないかと思います。つまり、ワイヤ プロトコルが間違っています。そこでは WireShark が役に立ちます。

于 2011-04-04T11:52:15.177 に答える