1 つの TCP ソケットから別の TCP ソケットに一度に 32768 バイトを超える送信を行う

StackOverflow https://stackoverflow.com/questions/2224550

質問

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

2 つの TCP ソケットがあります (次のように開いています) NSSocketPort 二人で聞いてます NSFileHandle)そして今、私はいくつかを送りたいと思っています NSData それらの間の。

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

送信するまではすべて問題ありません NSData 32768 バイトを超える長さのインスタンス。このバイト数を超えるバイトは転送されません。そこで私の質問は次のとおりです。

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

ちなみに、このシングルを送った後、 NSData たとえば、両方のソケットを再度閉じる必要があります。

役に立ちましたか?

解決

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

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

他のヒント

あなたの問題は、ココアではありませんが、ストリームソケットの概念誤解のように見えます。

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

あなたは32768のバイトを送信する場合は、

、受信端は32768バイトにのシングルバイトのどこからでも返すために(またはそれを呼び出して何でも)て、readDataのために準備する必要があります。あなたは以下の32768のバイトを取得した場合は、残りの部分を取得するために再度お読みください。またはそうでないかもしれない残りのすべて、あなたはまだ、再び読まなければなりません。それは、すべてのデータを得たときに、受信側が知っているように、ネットワークプロトコルを設計するのはあなた次第です。その長さのデータを付けることによって、例えば

書き込みデータは、あなたが送信するためにそれを告げたデータよりも少ない送信した場合、残りのデータを再び書き込みデータを呼び出します。そしてまた、あなたが尋ねたよりも少ないを送信するためにします。

のことのために準備すること
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top