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);

しかし、現在のコードでは、データ量の少ないファイルを転送するのに適しているだけで、ファイルが大きいと耐えられないので、ブレークポイントの継続を検討しなければなりません.後で検討しましょう.本文は初心者にしか向いていないので、大牛たちは小説だと思っています.これは最も基本的な伝送コードにすぎず、後で徐々に改善されます.