⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receivefile.cpp

📁 本代码是基于LINUX系统下的
💻 CPP
字号:
// ReceiveFile.cpp: implementation of the CReceiveFile class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Client.h"
#include "ReceiveFile.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CReceiveFile::CReceiveFile()
{

}

CReceiveFile::~CReceiveFile()
{

}
int CReceiveFile::Client(  CString strIP ,CString filemsg)
{
	int nResult = 0;
	
	//1、启动Winsock:对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的资源。(服务器端和客户端)
	WORD wVersion = MAKEWORD( 2, 0 );
	WSADATA wsData;
	nResult = WSAStartup( wVersion, &wsData );
	if( nResult !=0 )
	{
		return SOCK_WSA_ERR;
	}
	
	//2、创建套接字:(服务器端和客户端)
	SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
	if( s == INVALID_SOCKET )
	{
		return SOCK_CRSOCK_ERR;	 //错误处理
	}
	
	unsigned long uladdr;
	uladdr = inet_addr(strIP);	
	 //sock=socket(AF_INET,SOCK_STREAM,0);
	struct sockaddr_in sa;
	memset(&sa,0,sizeof(sa));
	sa.sin_family=AF_INET;
	sa.sin_port=htons(8439);
	sa.sin_addr.S_un.S_addr=uladdr;
	nResult = connect(s,(const sockaddr*)&sa,sizeof(sa));
	//4、套接字的连结:将两个套接字连结起来准备通信。(客户端)
	
	/*int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )
	s为欲连结的已创建的套接字。
	name为欲连结的socket地址。
	namelen为socket地址的结构的长度。*/


	/*unsigned long uladdr;
    uladdr = inet_addr("192.168.3.48");	
	sockaddr_in addr;
	memset( &addr , 0x00 , sizeof( addr ));
	addr. sin_family = AF_INET;
	addr. sin_port = htons(SVR_PORT); 			//保证字节顺序
	addr. sin_addr.s_addr = htonl( uladdr ); 		//保证字节顺序

	nResult = connect( s, ( sockaddr*)&addr, sizeof( sockaddr ) );*/
	if( nResult == SOCKET_ERROR )
	{
		return SOCK_CONNECT_ERR;		//错误处理
	}
	
	
	//6、 套接字的数据接收:(客户端)
	nResult = RecevData( s ,filemsg);
	if(nResult < 0 )
	{
		return nResult;	//错误处理
	}
	
	//7、 关闭套接字:释放所占有的资源。(服务器端和客户端)
	
	
	nResult=closesocket(s);
	if(nResult==SOCKET_ERROR)
	{
	//错误处理
	}
	return TRAN_SUCCESS;
}

//---------------------------------------------------------------------------------
int CReceiveFile::RecevData( SOCKET  s ,CString filemsg)
{
	FILE* 			stream;
	struct Fileinfo 	fileinfo;
	int nRet = 0;
	unsigned long dataLength /*cbBytesRet*/, cbLeftToReceive;
	BYTE* recdData = NULL;
	
	memset( &fileinfo, 0x00, sizeof(fileinfo) );
	nRet = recv( s , ( char *)&fileinfo, sizeof(fileinfo), 0 );
	if( nRet == SOCKET_ERROR )
	{
		return SOCKET_ERROR;
	}

	if( ( stream = fopen( filemsg, "wb") ) == NULL)
	{
		return FILE_ERR;
	}
//	char *tt;
//	nRet = send( s, ( char *)"OK" , sizeof( "OK" ),0 );
		
	dataLength = fileinfo.fileSize;
	recdData = new byte[RECV_BUFFER_SIZE];
	cbLeftToReceive = dataLength;
	int ii=0;
	do
	{	
		int iiGet, iiRecd;
		
		iiGet = ( cbLeftToReceive < RECV_BUFFER_SIZE ) ? cbLeftToReceive : RECV_BUFFER_SIZE ;
		iiRecd = recv( s, ( char *)recdData, iiGet, 0 );
		
		// test for errors and get out if they occurred
		if ( iiRecd == SOCKET_ERROR || iiRecd == 0 )
		{
			return SOCK_RECVE_ERR;
		}
		printf("%d\n",ii++);
		fwrite( recdData, iiRecd, 1, stream ); // Write it
		cbLeftToReceive -= iiRecd;
		send(s, (char *)&ii,sizeof(ii),0);
	} 
	while ( cbLeftToReceive > 0 );
	
	return TRAN_SUCCESS;
		
}

void CReceiveFile::PrintReturn( int nRet)
{
	switch( nRet )
	{
	case	TRAN_SUCCESS:		AfxMessageBox("TRAN_SUCCESS"); break;			//传输成功
	case	SOCK_WSA_ERR:		AfxMessageBox("SOCK_WSA_ERR"); break;			//启动winsock失败
	case	SOCK_CRSOCK_ERR:	AfxMessageBox("SOCK_CRSOCK_ERR"); break;			//创建套接字失败
	case	SOCK_BIND_ERR:		AfxMessageBox("SOCK_BIND_ERR"); break;	//绑定端口失败
	case	SOCK_LISTEN_ERR:	AfxMessageBox("SOCK_LISTEN_ERR"); break;		//监听失败
	case	SOCK_ACCEPT_ERR:	AfxMessageBox("SOCK_ACCEPT_ERR"); break;		//等待连接失败
	case	SOCK_SEND_ERR:		AfxMessageBox("SOCK_SEND_ERR"); break;	//发送数据失败
	case	SOCK_CLOSE_ERR:		AfxMessageBox("SOCK_CLOSE_ERR"); break;	//关闭	SOCKET失败
	case	SOCK_RECVE_ERR:		AfxMessageBox("SOCK_RECVE_ERR"); break;	//接受数据失败
	case	SOCK_CONNECT_ERR:	AfxMessageBox("SOCK_CONNECT_ERR"); break;
	case	FILE_ERR:			AfxMessageBox("FILE_ERR"); break;	//文件错误
	case 	Other_ERR:			AfxMessageBox("Other_ERR"); break;	//其他不明原因
	default: AfxMessageBox("NO ERROR");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -