0

C++言語を使用してクライアントからサーバーへのソケットを使用してファイル転送を行いたい...

私が持っているコードは、文字列をクライアントとサーバーに転送するだけです。

ファイルを転送するにはどうすればよいですか?ヘルプや参考資料も役立ちます。

4

3 に答える 3

2

ファイルをバイト ストリームに変換し、これをソケット経由で送信して、サーバー上でバイトストリームとして読み取ります。

于 2011-04-22T16:26:41.343 に答える
2

Winsock 固有のソリューションで問題ない場合は、TransmitFile()関数を見てください。Linux と Solaris はどちらもsendfile()似たような機能を持っていますが、Linux と Solaris のsendfile()API は少し異なると思います。これらの関数には、ファイルの内容をアドレス空間にコピーする必要がないという追加の利点があります。

それ以外の場合は、以下を含むがこれらに限定されないいくつかのオプションがあります。

  • ファイルのチャンクをバッファに読み込み、そのバッファをソケット経由で送信します。送信が完了するまで、ファイルを反復処理し続けます。データに穴がないことを確認するために、送信されるバイト数 (つまり、書き込み操作の戻り値) に注意を払う必要があることに注意してください。
  • ファイルをプロセス アドレス空間にメモリ マップし、メモリ マップされたバッファからソケットに直接書き込みます。このアプローチにより、ファイルのコンテンツをプロセスにコピーする必要がなくなるため、大きなファイルを送信するときにパフォーマンスが向上する可能性があります。ただし、sendfile()andTransmitFile()関数は依然として高速です。いつものように、コードをプロファイリングします。

考慮すべきもう 1 つのことは、ソケット書き込み操作をブロックするか非ブロックにするか、および受信側でも同様にするかどうかです。ノンブロッキング IO では、プラットフォームのイベント逆多重化メカニズム ( select()POSIX プラットフォームなど) を使用する必要があります。

Boost.Asioを使用すると、タスクも大幅に簡素化される可能性があります。可能であれば、ネイティブ API よりも使用することをお勧めします。

チッ!

于 2011-04-22T18:00:16.840 に答える
0

MSDN に従ってCSocketFileを見ることもできます

クラスCSocketFileは CFile から派生しますが、位置決め関数 (Seek、GetLength、SetLength など)、ロック関数 (LockRange、UnlockRange)、または GetPosition 関数などの CFile メンバー関数をサポートしません。CSocketFile オブジェクトが行う必要があるのは、関連する CSocket オブジェクトとの間で一連のバイトを読み書きすることだけです。

于 2011-04-22T18:36:34.023 に答える