0

私はこのタスクをほぼ完了しましたが、部分的な結果が得られたため、ポイントに行き詰まりました。TCP IPソケット接続が存在するサーバー(LinuxまたはWindows)とクライアント(iOS)があります。アプリケーションが開くとサーバーとiphoneの間の接続が自動的に行われるiphoneシミュレーターでフォームロードを使用しました。サーバーは、シミュレーターで送信したデータを送り返し、ログに出力します。しかし、私は応答全体を正確に受け取ることができません。"Innovations" については、"in" や "Innova" などを受け取ります。以下にコード スニペットを示します。

void TCPClient()
{

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream);
    [NSThread sleepForTimeInterval:2]; //Delay


    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    if(!CFWriteStreamOpen(writeStream))
    {
        NSLog(@"Error Opening Socket");
    }
    else
    {
        UInt8 buf[] = "Innovations";
        int bytesWritten = CFWriteStreamWrite(writeStream, buf, strlen((char*)buf));
        NSLog(@"Written: %d", bytesWritten);
    }
    CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    if(!CFReadStreamOpen(readStream))
    {
        NSLog(@"Error reading");
    }
    else
    {
        UInt8 bufr[15];
        int bytesRead  = CFReadStreamRead(readStream, bufr,strlen((char*)bufr));
        NSLog(@"Read: %d", bytesRead);
        NSLog(@"buffer: %s", bufr);
    }
}

配列のサイズを変更したことに注意してください。しかし、私はまだエラーが発生します。ボタンの IBAction の場合も同様です。それでも、クリックするたびにデータを送信していますが、同じデータの応答が得られません。

貴重な提案はできますか???

4

1 に答える 1

1

1つのエラーは、

int bytesRead  = CFReadStreamRead(readStream, bufr,strlen((char*)bufr));

する必要があります

int bytesRead  = CFReadStreamRead(readStream, bufr, sizeof(bufr));

の最後のパラメータは読み取りバッファCFReadStreamRead容量で、読み取られる最大バイト数を決定します。現在バッファにある文字列strlen((char*)bufr)長さです。bufrまた、印刷する前に、文字列を NULL で終了する必要があります。

この変更により、プログラムは短い文字列で動作する可能性があります。しかし、大量のデータを送受信しようとするとすぐに問題が発生します。

ソケット書き込みは、要求したよりも少ないバイトを書き込むことができ、ソケット読み取りは、要求したよりも少ないバイトを返すことができます。

ソケット ストリームを runloop に登録し、ストリーム イベントを非同期に処理する方法について説明しているStream Programming Guideを参照してください。

于 2013-03-23T06:08:04.250 に答える