0

TCP/IP 経由で Linux C サーバーを使用して iOS クライアントをセットアップしています。私が直面している問題は次のとおりです。接続が完了すると、サーバーはデータを待機し (read())、iPod から受信したデータを画面に表示します。その後、再び read() に戻ります。この読み取り/書き込みは一度だけ行うことができますが、永続的に行うことはできません。コードは次のとおりです。

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

      case NSStreamEventHasSpaceAvailable:
         event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

        if (theStream == oStream)
         {
         //send data                

             uint8_t buffer[11] = "I send this";             
             int len;

             len = [oStream write:buffer maxLength:sizeof(buffer)];
             if (len > 0)
            {
                NSLog(@"Data sent");
                [oStream close];
            }
         }

        break;

わかった。したがって、サーバー側で読み取りが行われると、このメソッドとケースは自動的に実行されます。これは、サーバーでの最初の read() 呼び出しではうまく機能しますが、2 回目の呼び出しでは、サーバーは一部のデータのためにハングアップしたままになります。私がxcodeに持っているログは、何が起こるかを示しています:

2011-06-17 16:23:50.154 sliderFinal[7430:207] >> : NSStreamEventOpenCompleted //ストリームの 1 つが開かれました

2011-06-17 16:23:50.156 sliderFinal[7430:207] << : NSStreamEventOpenCompleted //他のストリームが開かれた

2011-06-17 16:23:50.157 sliderFinal[7430:207] データが送信されまし た //サーバーからの最初の read() の後にデータが送信されました

2011-06-17 16:23:50.159 sliderFinal[7430:207] << : NSStreamEventHasSpaceAvailable //これは、サーバーからの最初の read() 呼び出しを参照します

最初のラウンドの後、サーバーが何かを待ち続けていることがわかります。このメッセージは、再び NSStreamEventHasSpaceAvailable に到達しないようです。何か案は?

4

1 に答える 1

0

私はそれを働かせたようです。質問に投稿したコードにエラーがあったかどうかは正確にはわかりませんが(実際に必要なメッセージが送信されたため、そうは思いません)、別の書き方を使用することになりました。

これは使用された方法でした:

 -(NSInteger) writeToServer:(const uint8_t *) buf 
  {
     return [oStream write:buf maxLength:strlen((char*)buf)];    
  }

そして、これは私が使用したコードです(質問に投稿されたものではなく):

case NSStreamEventHasSpaceAvailable:
    event = @"NSStreamEventHasSpaceAvailable";
        connectButton.enabled = NO;
        disconnectButton.enabled = YES;

        if (theStream == oStream)
         {
         //send data

             NSString *msg = [[NSString alloc] initWithFormat:@"ping"];
             const uint8_t *buffer = (const uint8_t *)[msg UTF8String];  
             NSInteger err = [self writeToServer:buffer];
             [msg release];

             if ( err == -1)
                 NSLog(@"Error sending data."); 
             else   
                 NSLog(@"Success sending data.");

break;

また、サーバーがread()printf(msg)の後に、接続が終了したというメッセージが表示されることに気付いたので、サーバーがまだあるかどうかを確認するサーバー側のコードを変更しました次のように、クライアントに接続します。

check = recv(newsockf,buffer,256, MSG_PEEK|MSG_DONTWAIT);

if(!(check < 0 && errno == EAGAIN))
{
  //close socket;
  //accept();
}

..これに:

if((check < 0 && errno != EAGAIN))
{
  //close socket;
  //accept();
}

それはトリックをやったようです。これで、何の理由もなく切断されなくなりました。問題が解決しました。

于 2011-06-18T17:26:35.743 に答える