VC++网络编程-文件传输
在SOCKET编程中,以前学习的时候都是简单的字符传输,而在实际的应用中,经常需要传输文件,其实网络上的文件传输都是先把数据转化为字节流,当然,最底层的是01二进制数据的传输,但是这部在我们讨论范围之内,其实现在还只是研究小文件怎么传输,当文件很大时,需要用到断点续传。
好了,要传输文件,首先先要计算出服务器端文件的大小,然后打开数据,读入到缓冲区中,首先发送文件的大小给客户端,然后客户端根据收到的文件大小,重新建立文件。
服务器端代码如下:
[cpp]
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); //关闭文件
客户端代码如下:
[cpp]
int nDatalen = 0;
recv(sockClient,(char*)&nDatalen,4,0);
printf("%d\n",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
);
或者客户端重建文件的代码如下:
[cpp]
FILE *fp = fopen("recv.rar","w+b");
fwrite(data,nDatalen,1,fp);
fclose(fp);
但是,就目前的这代码,还只适合传输数据量比较小的文件,当文件比较大时,就不能忍受了,所以就必须研究断点续传,以后研究吧。本文只适合初学者,大牛们就当是小说。这只是最基本的传输代码,后面会逐步完善。
补充:软件开发 , Vc ,