1 つの TCP ソケットから別の TCP ソケットに一度に 32768 バイトを超える送信を行う
-
19-09-2019 - |
質問
皆さん、この質問がまだあるかどうかはわかりませんが、次の状況を想像してください。
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 つ以上のパケットで) データの配信が保証されるか、正常に失敗するかのいずれかであることです。
- 送信前にデータを分割する必要はありません。基盤となるシステムがそれを行います。
- 受信側では、利用可能なデータを読み取り、さらにバイトが到着するまで待機し、利用可能なデータがなくなるまで処理を繰り返すことができます。送信者がデータの送信を完了すると、ソケットが閉じられ、受信者は通知を受け取ります。
他のヒント
あなたの問題は、ココアではありませんが、ストリームソケットの概念誤解のように見えます。
TCPはストリームプロトコルです。別々の書き込みの境界は保持されません。
あなたは32768のバイトを送信する場合は、、受信端は32768バイトにのシングルバイトのどこからでも返すために(またはそれを呼び出して何でも)て、readDataのために準備する必要があります。あなたは以下の32768のバイトを取得した場合は、残りの部分を取得するために再度お読みください。またはそうでないかもしれない残りのすべて、あなたはまだ、再び読まなければなりません。それは、すべてのデータを得たときに、受信側が知っているように、ネットワークプロトコルを設計するのはあなた次第です。その長さのデータを付けることによって、例えば
書き込みデータは、あなたが送信するためにそれを告げたデータよりも少ない送信した場合、残りのデータを再び書き込みデータを呼び出します。そしてまた、あなたが尋ねたよりも少ないを送信するためにします。
のことのために準備すること