C++ ソケットを使用して 1 つのパケットで大きなデータ (3MB など) を送信するように OS (WIN7) をガイドする方法はありますか?
データを多くのパケットに分けずに「送信」機能でデータを送信することを意味します。
iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The File
(ソケットを介して 3MB のサイズの png ファイルを送信しようとしています)。ありがとう。
IP パケットの長さフィールドが 2 バイトであることを考えると、いいえ。ストリームは最大 65k のパケットに分割されます。ただし、TCP はストリーム プロトコルであるため、パケットをどのようにフォーマットして送信するかは実装次第です。送信した順序で送信したデータを取得することのみが保証されます。
送信したデータの末尾を知りたい場合は、最初にデータ サイズを送信してから、その量のデータを読み取ることを検討してください。
unsigned int len = vect.size();
iResult = send( ConnectSocket, &len, sizeof(len), 0 ); // Sending The Length
iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The File
次に、受信側で:
unsigned int len;
iResult = recv(socket, &len, sizeof(len), 0);
// now you know how much data to read to get your png
send
また、1回の呼び出しでバッファ全体を送信する必要がないため、各呼び出しで送信される量を確認する必要があることに注意してください。と同じrecv
。recv
送信されたデータ全体を読み取るために、複数回呼び出す必要がある場合があります。
TCP はストリーム トランスポートであり、パケット トランスポートではなく、パケット サイズが保証されることはありません。また、ソフトウェアとハードウェアに実装されているサイズ制限があり、希望のサイズよりもはるかに小さくなっています。
ストリームの代わりにパケットを送信したい場合は、UDP を使用できますが、これには欠点があります。そして、そのような大きなパケットは完全に不可能です. インターネット上で最大の安全な UDP パケット サイズを確認してください
これは明らかに、少し「プロトコル」が必要なように思えます。相手に何を期待するかを伝える方法が必要です。たとえば、パケットの最初の 4 バイト (または 8 バイト) を送信全体の「長さ」として送信し、その後に 3MB のデータを送信することができます。受信側は、データの長さを含むパケットを「開始」で受信し、その送信に必要なすべてのデータのフェッチに進みます。すべてのデータを受信したら、最初から長さを受信し、その長さのすべてのデータを受信するまでループします。