VC++网络编程-文件传输

长平狐 发布于 2013/12/25 17:25
阅读 92
收藏 0

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


 

或者客户端重建文件的代码如下:

FILE *fp = fopen("recv.rar","w+b");
	fwrite(data,nDatalen,1,fp);
	fclose(fp);


但是,就目前的这代码,还只适合传输数据量比较小的文件,当文件比较大时,就不能忍受了,所以就必须研究断点续传,以后研究吧。本文只适合初学者,大牛们就当是小说。这只是最基本的传输代码,后面会逐步完善。


原文链接:http://blog.csdn.net/zhouxuguang236/article/details/8020195
加载中
返回顶部
顶部