VC++使用Socket网络编程传输文件

从来没弄过Socket的一些东西,最近看了看,一些小东西,希望能帮到和我一样的菜鸟。

1、win32程序下的文件传输

1.1、Client Code

#include <Winsock2.h>
#include <stdio.h>
 
long GetFileLen(FILE *_file)
{
  	long curPosit=ftell(_file),fileLen;
  	fseek(_file,0,SEEK_END);
  	fileLen=ftell(_file);
  	fseek(_file,curPosit,SEEK_SET);
  	return fileLen;
}
 
void main()
{
  	WORD wVersionRequested;
 	WSADATA wsaData;
  	int err;
 
 	wVersionRequested = MAKEWORD(2,2);
 
 	err = WSAStartup(wVersionRequested,&wsaData);
 
 	if(err != 0)
  	{
      		return;
  	}
 
 	if(LOBYTE( wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
  	{
      		WSACleanup();
      		return;
  	}
 
 	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
 
 	SOCKADDR_IN addrSrv;
  	addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.28");
  	addrSrv.sin_family=AF_INET;
  	addrSrv.sin_port=htons(6000);
 
 	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
 
 	FILE *writeFile=fopen("F:\\b.doc","wb");     
 	char recvBuf[100];     
 	int rc; 
 	while((rc=recv(sockClient,recvBuf,100,0))>0) 
 	{       
 		fwrite(recvBuf,sizeof(char),rc,writeFile);   
 	} 
 	closesocket(sockClient);
  	WSACleanup();
}
  

 

1.2、Server Code

#include <Winsock2.h>
#include <stdio.h>

void main()
{
 	WORD wVersionRequested;
 	WSADATA wsaData;
 	int err;

 	wVersionRequested = MAKEWORD(2,2);

 	err = WSAStartup(wVersionRequested,&wsaData);

 	if(err != 0)
 	{
     		return;
 	}

 	if(LOBYTE( wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
 	{
     		WSACleanup();
     		return;
 	}

 	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
 	SOCKADDR_IN addrSrv;
 	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 	addrSrv.sin_family=AF_INET;
 	addrSrv.sin_port=htons(6000);

 	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));


 	listen(sockSrv,5);

	SOCKADDR_IN addrClient;
 	int len=sizeof(SOCKADDR);

    	SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

 	FILE *readFile;
  	readFile=fopen("E:\\a.doc","rb");
  	char recvBuf[100];
  	int rc;
  	long fileLen=GetFileLen(readFile);
  	while((rc=fread(recvBuf,sizeof(char),100,readFile))!=0)
  	{
       		send(sockConn,recvBuf,(sizeof(char)*rc),0);
       		printf("%d%%\n",(short)((((double)ftell(readFile))*100)/(double)fileLen));
  	}
 
 	closesocket(sockConn);
 	closesocket(sockSrv);
 	WSACleanup();
} 


 

2、MFC项目文件传输

文件结构:
typedef struct _SOCKET_STREAM_FILE_INFO
{   
TCHAR       szFileTitle[128];        //文件的标题名    DWORD      
dwFileAttributes;                   //文件的属性   
FILETIME    ftCreationTime;         //文件的创建时间   
FILETIME    ftLastAccessTime;                   //文件的最后访问时间   
FILETIME    ftLastWriteTime;                    //文件的最后修改时间   
DWORD       nFileSizeHigh;                      //文件大小的高位双字   
DWORD       nFileSizeLow;                       //文件大小的低位双字   
DWORD       dwReserved0;                        //保留,为0   
DWORD       dwReserved1;                        //保留,为0
} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;

2.1、服务器程序 

	CFile myFile; 
	if(!myFile.Open("文件路径以及文件名", CFile::modeRead | CFile::typeBinary)) 
	{  
 		AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);  
 		return; 
	}  

	CSocket sockSrvr; 
	sockSrvr.Create(800); 
	sockSrvr.Listen(); 
	CSocket sockRecv; 
	sockSrvr.Accept(sockRecv);
	SOCKET_STREAM_FILE_INFO StreamFileInfo; 
	WIN32_FIND_DATA             FindFileData; 

	FindClose(FindFirstFile(Dlg.GetPathName(),&FindFileData));    
	memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));    
	strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());    

	StreamFileInfo.dwFileAttributes     =       FindFileData.dwFileAttributes;    
	StreamFileInfo.ftCreationTime       =       FindFileData.ftCreationTime;    
	StreamFileInfo.ftLastAccessTime     =       FindFileData.ftLastAccessTime;    
	StreamFileInfo.ftLastWriteTime      =       FindFileData.ftLastWriteTime;    
	StreamFileInfo.nFileSizeHigh        =       FindFileData.nFileSizeHigh;    
	StreamFileInfo.nFileSizeLow         =       FindFileData.nFileSizeLow; 

	sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO)); 
	UINT dwRead=0; 

	while(dwRead<StreamFileInfo.nFileSizeLow) 
	{  
	byte* data = new byte[1024];  
	UINT dw=myFile.Read(data, 1024);  
	sockRecv.Send(data, dw);  
	dwRead+=dw; 
	} 

	myFile.Close(); s
	ockRecv.Close(); 
	AfxMessageBox("发送完毕!"); 


 

2.2、客户端程序

	AfxSocketInit(NULL); 
	CSocket sockClient; 
	sockClient.Create(); 

	CString szIP = "服务器IP地址,本机就直接127.0.0.1";  

	if(!sockClient.Connect((LPCTSTR)szIP, 800)) 
	{  
		AfxMessageBox("连接到对方机器失败!");  
		return;
	}  

	SOCKET_STREAM_FILE_INFO StreamFileInfo; 
	sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO)); 

	CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); 
	UINT dwRead = 0; 
	while(dwRead<StreamFileInfo.nFileSizeLow) 
	{  
		byte* data = new byte[1024];  
		memset(data,0,1024);  
		UINT dw=sockClient.Receive(data, 1024);  
		destFile.Write(data, dw);  dwRead+=dw; 
	} 

	SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,                
	&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime); 
	destFile.Close(); SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes); 
	sockClient.Close(); 
	AfxMessageBox("接收完毕!");  


 

 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值