2011-06-24 27 views
1

私のサーバーにNSStringを送信する小さなアプリケーションを作成しました。私はそこで実行されているアプリケーションを持っています。これは適切なポートを待ち受けており、ゴミ箱のように動作します。そこから来るすべてのデータが保存されます。ここで CFWriteStreamを使用してファイルをソケットに転送する

static void WriteStreamClientCallBack(CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo) { 
    NSLog(@"%lu", type); 
    switch (type) 
    { 
     case kCFStreamEventEndEncountered: 
     { 
      NSLog(@"Closing"); 
      CFWriteStreamClose(stream); 
      break; 
     } 
     case kCFStreamEventErrorOccurred: 
     { 
      NSLog(@"Crap, error!"); 
      break; 
     } 
     case kCFStreamEventCanAcceptBytes: 
     { 
      NSLog(@"Stream can accept more bytes"); 
      NSString *reqStr = [NSString stringWithFormat: @"ConReq"]; 
      const UInt8 *rawstring = (const UInt8 *)[reqStr UTF8String]; 
      CFWriteStreamWrite(stream, rawstring, strlen((char *)rawstring)); 
     } 
     case kCFStreamEventNone: 
     { 
      NSLog(@"Nothing is happening"); 
      break; 
     } 
     case kCFStreamEventOpenCompleted: 
     { 
      NSLog(@"Opened stream!"); 
      break; 
     } 
    } 
} 

は問題が来る:私はボタンを押したときに、それはそこにループされたまま

-(IBAction)pressButton:(id)sender { 
    NSString *iHostname = [NSString stringWithFormat:@"xxx.xxx.xxx.xxx"]; 
    NSString *iPort = [NSString stringWithFormat:@"9100"]; 

    CFWriteStreamRef writeStream; 
    static const CFOptionFlags kWriteNetworkEvents = kCFStreamEventEndEncountered | 
    kCFStreamEventErrorOccurred | 
    kCFStreamEventCanAcceptBytes | 
    kCFStreamEventOpenCompleted | 
    kCFStreamEventNone; 
    CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL}; 
    CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault,(CFStringRef)iHostname); 

    CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, [iPort intValue], 
             NULL, &writeStream); 

    CFWriteStreamSetClient(writeStream, kWriteNetworkEvents, WriteStreamClientCallBack, &ctxt); 
    CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 

だから、私は実行ループメソッドを呼び出します。

は、私が作成したiPhoneアプリケーションでは、これは使用しています。ロギングでは、kCFStreamEventCanAcceptBytesという名前のケースが呼び出されています。実際に、プログラムを強制終了すると、サーバにはConReqという多数のファイルが入っています。それについて何をすべきか、何が間違っているのですか?

PS。コードはhereです。

答えて

1

「受け入れる」イベントは、送信するデータがさらにある場合、ブロックせずに送信できることを示します。あなたの問題は、送信したデータの量、送信したデータの量、およびソケットが現在データを受け入れることができるかどうかを追跡していないことです。代わりに、より多くのデータを送信するスペースがあるたびに、毎回まったく同じデータを送信します。これはあまりデータではないので、「より多くのデータの準備ができました」という事実をすばやく確認する必要があります。

+0

私には論理的に見えます。任意のアイデアはどのようにこの問題を解決するには?私はネットワークコーディングで最悪です... – Joetjah

+0

Appleのサンプルコードを見てください。 'ASIHTTPRequest'プロジェクトには、例として使用できるストリームを扱う多くのコードも含まれています。 –

関連する問題