0

やあみんな、この質問がまだ出されているかどうかはわかりませんが、次の状況を想像してみてください。

2つのTCPソケット(2つで開いてNSSocketPortリッスンしてNSFileHandleいる)があり、それらの間にいくつかを送信したいと思いNSDataます。

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

NSData32768バイトを超える長さのインスタンスを送信するまではすべて問題ありません。このバイト数を超えると転送されません。だからここに私の質問があります:

1)Cocoaが一度に32768バイト以上を送信できないのはなぜですか?
2)回避策を講じる必要がありますか?
3)はいの場合、データを分割しますが、どのように分割しますか?そして、他のソケットは、すべてのデータがいつ送信されたかをどのように知るのでしょうか?

ちなみに、この単一NSDataインスタンスを送信した後、両方のソケットを再度閉じる必要があります。

4

2 に答える 2

2

あなたの問題はCocoaにあるのではなく、ストリームソケットの概念的な誤解であるように思われます。

TCPはストリームプロトコルです。個別の書き込みの境界は保持されません。

32768バイトを送信する場合、受信側は、readData(またはそれが呼び出されるもの)が1バイトから32768バイトまでの任意の場所を返すように準備する必要があります。取得するバイト数が32768バイト未満の場合は、残りを取得するためにもう一度読む必要があります。または、残りのすべてではないかもしれません、そしてあなたはもう一度読む必要があります。受信側がすべてのデータをいつ取得したかを知ることができるように、ネットワークプロトコルを設計するのはあなた次第です。たとえば、データの前にその長さを付けます。

writeDataが送信するように指示したデータよりも少ないデータを送信する場合は、残りのデータを使用してwriteDataを再度呼び出します。そして、あなたが要求したよりも少ない量を送るように準備してください。

于 2010-02-08T20:21:19.103 に答える
2

一度に送信されるデータの量は、基盤となるフレームワークとライブラリが使用するバッファのサイズによって異なります。構成可能かもしれませんが、ほとんど関係ありません。TCPの利点は、データを(1つ以上のパケットで)配信することを保証するか、正常に失敗することです。

  1. 送信する前にデータを分割する必要はありません。基盤となるシステムがそれを行います。
  2. 受信側では、利用可能なデータを読み取り、さらにバイトが到着するまで待機し、それらを処理するなど、利用可能なデータがなくなるまで待つことができます。送信者がデータの送信を完了すると、ソケットが閉じられ、受信者に通知が届きます。
于 2010-02-08T20:25:40.587 に答える