VC++ネットワークプログラミング-ファイル転送
SOCKETプログラミングでは、以前勉強していたときは簡単な文字転送でしたが、実際の応用では、ファイルの転送がよく必要になります.実は、ネットワーク上のファイル転送はまずデータをバイトストリームに変換します.もちろん、最下層は01バイナリデータの転送ですが、これは私たちの議論の範囲内です.実は、今は小さなファイルの転送方法を研究しているだけです.ファイルが大きい場合は、ブレークポイントの再送信が必要です.
では、ファイルを転送するには、まずサーバ側のファイルのサイズを計算し、データを開き、バッファに読み込み、まずファイルのサイズをクライアントに送信し、クライアントは受信したファイルのサイズに基づいてファイルを再構築します.
サーバ側のコードは次のとおりです.
クライアント・コードは次のとおりです.
または、クライアントがファイルを再構築するコードは次のとおりです.
しかし、現在のコードでは、データ量の少ないファイルを転送するのに適しているだけで、ファイルが大きいと耐えられないので、ブレークポイントの継続を検討しなければなりません.後で検討しましょう.本文は初心者にしか向いていないので、大牛たちは小説だと思っています.これは最も基本的な伝送コードにすぎず、後で徐々に改善されます.
では、ファイルを転送するには、まずサーバ側のファイルのサイズを計算し、データを開き、バッファに読み込み、まずファイルのサイズをクライアントに送信し、クライアントは受信したファイルのサイズに基づいてファイルを再構築します.
サーバ側のコードは次のとおりです.
HANDLE hFile;
hFile = CreateFile(_T("D:\\ \\ .rar"), // open MYFILE.TXT
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("Could not open file.")); // process error
}
DWORD dwFileSize = 0;
dwFileSize = GetFileSize(hFile,NULL);
byte *pBuffer = new byte[dwFileSize];
DWORD dwReadSize = 0; //
::ReadFile(hFile,pBuffer,dwFileSize,&dwReadSize,NULL);
send(sockConn,(const char*)&dwReadSize,4,0); //
send(sockConn,reinterpret_cast<char *>(pBuffer),dwReadSize,NULL); //
CloseHandle(hFile); //
クライアント・コードは次のとおりです.
int nDatalen = 0;
recv(sockClient,(char*)&nDatalen,4,0);
printf("%d
",nDatalen);
byte *data = new byte[nDatalen];
recv(sockClient,(char*)data,nDatalen,0);
HANDLE hFile;
hFile = CreateFile("recv.rar", // open MYFILE.TXT
GENERIC_WRITE, // open for reading
FILE_SHARE_WRITE, // share for reading
NULL, // no security
CREATE_NEW, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file."); // process error
}
WriteFile(
hFile, // handle to file
data, // data buffer
nDatalen, // number of bytes to write
(LPDWORD)&nDatalen, // number of bytes written
NULL // overlapped buffer
);
または、クライアントがファイルを再構築するコードは次のとおりです.
FILE *fp = fopen("recv.rar","w+b");
fwrite(data,nDatalen,1,fp);
fclose(fp);
しかし、現在のコードでは、データ量の少ないファイルを転送するのに適しているだけで、ファイルが大きいと耐えられないので、ブレークポイントの継続を検討しなければなりません.後で検討しましょう.本文は初心者にしか向いていないので、大牛たちは小説だと思っています.これは最も基本的な伝送コードにすぎず、後で徐々に改善されます.