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

📄 cfile.cpp

📁 unix下的C语言文件传输服务器端源程序文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if (memcmp(pRespond->filestatus,"OK",2)!=0)
	{
		if (memcmp(pRespond->filestatus,"ERR",3)==0)
		{
			memcpy(pszRet,pRespond->filestatus+3,2);
			pszRet[2] = 0;
			iRet=atoi(pszRet);
			printf("ATMP Recv Respond error [%d]!",iRet);
			return(-iRet);
		}	
		printf("ATMP Recv Respond error !");
		return(-42);
	}
	return(0);
}

int CFileProcess::iSendFileData(SOCKET iSockfd,struct FILEDATA *pFileData,char *pszFileBuf,int iDataLen,int timeout)
{
	char 	pszSendBuf[DATA_LEN+1];
        int 	iSendLen;
		int iRet;
        
	memset(pszSendBuf,0,sizeof(pszSendBuf));
	memcpy(pszSendBuf,pFileData->cmd_code,6);
	pszSendBuf[6]=pFileData->filedata_sign;
	memcpy(pszSendBuf+7,pFileData->fileoffset,10);
	memcpy(pszSendBuf+17,pFileData->datalen,5);
	iSendLen = sizeof(*pFileData);
	memcpy(pszSendBuf+iSendLen,pszFileBuf,iDataLen);
	iSendLen += iDataLen;
	AddBufLen(pszSendBuf,&iSendLen);
        iRet=FileWrite(iSockfd,pszSendBuf,iSendLen);
        if(iRet!=0)
        {
        	 printf("Write error, Send FileData errno=[%d]\n",WSAGetLastError());
                return(-50);
        }
        return(0);
}	

int CFileProcess::iRecvFileData(SOCKET iSockfd,struct FILEDATA *pFileData,char *pszFileBuf,int *iDataLen,int timeout)
{
	int	iRecvLen,iRet;
	char	pszRecvBuf[DATA_LEN+1];
	char	pszRet[10];

	memset(pszRet,0x00,sizeof(pszRet));
	iRecvLen=0;						
	memset(pszRecvBuf,0,sizeof(pszRecvBuf));
	iRet=FileRead(iSockfd,pszRecvBuf,&iRecvLen);
	
	if(iRet!=0)
	{
		char tmpstr[256];
		sprintf(tmpstr,"line=[%d] read error FileData iLen=[%d]",__LINE__,iRecvLen);
//		ULOG("fser.log",tmpstr);
		
		sprintf(tmpstr,"terry iRecvFileData FileRead return[%d] : -1",iRet);
//		ULOG("fser.log",tmpstr);

		if(iRet!=10053)
		return(-1);
		else
			return iRet;
	}
	pszRecvBuf[iRecvLen]=0;	
	iRet=DelBufLen(pszRecvBuf,&iRecvLen);
	if (iRet<0) 
	{
		char tmpstr[256];
		sprintf(tmpstr,"terry DelBufLen  return[%d] :",iRet);
//		ULOG("fser.log",tmpstr);
		return(-61);
	
	}
	memset((char*)pFileData,0,sizeof(*pFileData));
	memcpy(pFileData->cmd_code,pszRecvBuf,6);
	pFileData->filedata_sign=pszRecvBuf[6];
	memcpy(pFileData->fileoffset,pszRecvBuf+7,10);
	memcpy(pFileData->datalen,pszRecvBuf+17,5);
	pFileData->datalen[5]=0;
	*iDataLen = atoi(pFileData->datalen);
	if (((pFileData->filedata_sign!='M')&&
	    (pFileData->filedata_sign!='E')&&
	    (*iDataLen<=0))
	    ||(memcmp(pszRecvBuf+6,"ERR",3)==0))
	{
		if (memcmp(pszRecvBuf+6,"ERR",3)==0)
		{
			memcpy(pszRet,pszRecvBuf+9,2);
			pszRet[2] = 0;
			iRet=atoi(pszRet);
			//printf("ATMP Recv Respond error [%d]!",iRet);
		char tmpstr[128];
		sprintf(tmpstr,"ATMP Recv Respond error [%d]!",iRet);
//			ULOG("fser.log",tmpstr);
			return(-iRet);
		}	
/********/		
		//printf("line=[%d] invalid DataBuf",__LINE__);   
		char tmpstr[128];
		sprintf(tmpstr,"line=[%d] invalid DataBuf",iRet);
//			ULOG("fser.log",tmpstr);
			return(-iRet);
		return(-62);
	}
	memcpy(pszFileBuf,pszRecvBuf+sizeof(*pFileData),*iDataLen);
	return(0);
}

int iStrToHeader(struct FILEHEADER *pFileHeader,char *pszRecvBuf,int iRecvLen)
{
	int	iRet;
	
	iRet=DelBufLen(pszRecvBuf,&iRecvLen);
	if (iRet<0) return(-1);
	memset((char*)pFileHeader,0,sizeof(*pFileHeader));
	memcpy(pFileHeader->cmd_code,pszRecvBuf,6);
	memcpy(pFileHeader->scr_fname,pszRecvBuf+6,80);
	memcpy(pFileHeader->dest_fname,pszRecvBuf+86,80);
	memcpy(pFileHeader->filelen,pszRecvBuf+166,10);
	memcpy(pFileHeader->pstart,pszRecvBuf+176,10);
	pFileHeader->trans_sign=pszRecvBuf[186];
	memcpy(pFileHeader->max_buf_len,pszRecvBuf+187,5);
	
	if ((pFileHeader->trans_sign!='U')&&
	    (pFileHeader->trans_sign!='D'))
	{
		printf("iStrToHeader Recv Header error !");
		return(-2);
	}
	return(0);
}

int CFileProcess::giPutFile(SOCKET sock, char *scr_path ,char *dest_path,int max_buf_len)
{
        struct 	FILEHEADER hFileHeader;
        struct  FILEDATA   hFileData;
        struct  RESPONSE   hRespond;
        int 	iRet;
        int	timeout;
        long 	lFileLocate,lFileLen;
        int	iReadLen,iDataLen;
        char	pszFileBuf[DATA_LEN+1],pszTemp[20];
        
        FILE 	*fp;
	timeout =30 ;

	if((fp=fopen(scr_path,"rb")) == NULL) 
	{
		printf("open file error!\n");
		return(-1);
	}
/*********组成报文头*******/
	lFileLen = GetFileLength(fp);
	memset((char*)&hFileHeader,0,sizeof(hFileHeader));
	memcpy(hFileHeader.cmd_code,"900011",6);
	strcpy(hFileHeader.scr_fname,scr_path);
	
	strcpy(hFileHeader.dest_fname,dest_path);
	FileTrace(hFileHeader.dest_fname);
	sprintf(pszTemp,"%010ld",lFileLen);
	memcpy(hFileHeader.filelen,pszTemp,10);
	
	sprintf(pszTemp,"%010d",0);
	memcpy(hFileHeader.pstart,pszTemp,10);

	hFileHeader.trans_sign = 'U';
	sprintf(pszTemp,"%05d",max_buf_len);
	memcpy(hFileHeader.max_buf_len,pszTemp,5);
	
	iRet=iSendHeader(sock,&hFileHeader,timeout);
	if (iRet<0)
	{
		fclose(fp);
		 return(iRet);
	}
	iRet=iRecvRespond(sock,&hRespond,timeout);
	if (iRet<0)
	{
		fclose(fp);
		 return(iRet);
	}

/*********传送文件内容报文并接受响应*******/
	lFileLocate=0;
	iReadLen = max_buf_len - 4 - sizeof(hFileData);
	do
	{
		iDataLen=fread(pszFileBuf,1,iReadLen,fp);
		if (iDataLen<0)
		{
			fclose(fp);
			return(-5);
		}
		pszFileBuf[iDataLen]=0;
		
		memset((char*)&hFileData,0,sizeof(hFileData));
	        memcpy(hFileData.cmd_code,"900011",6);
	        if (!feof(fp)) 
	              	hFileData.filedata_sign = 'M';
	        else  
	        	hFileData.filedata_sign = 'E';
	        sprintf(pszTemp,"%010ld",lFileLocate);
	        memcpy(hFileData.fileoffset,pszTemp,10);
	        sprintf(pszTemp,"%05d",iDataLen);
	        memcpy(hFileData.datalen,pszTemp,5);
	        
	        lFileLocate += iDataLen;
	        
		iRet=iSendFileData(sock,&hFileData,pszFileBuf,iDataLen,timeout);
		if (iRet<0) 
		{ 	
			fclose(fp);
			return(iRet);
		}
		iRet=iRecvRespond(sock,&hRespond,timeout);
		if (iRet<0) 
		{ 	
			fclose(fp);
			return(iRet);
		}
	}while (!feof(fp));
	fclose(fp);
	return(0);
}	 

int CFileProcess::giGetFile(SOCKET sock, char *scr_path ,char *dest_path,int max_buf_len)
{
        struct 	FILEHEADER hFileHeader;
        struct  FILEDATA   hFileData;
        struct  RESPONSE   hRespond;
        int 	iRet;
        int		timeout,j;
        long 	lFileLen,lFileOffset;
        int		iDataLen;
        char	pszFileBuf[DATA_LEN+1],pszFileOffset[11],pszTemp[20];
        
        FILE 	*fp;
	timeout =30 ;

	if((fp=fopen(dest_path,"wb+")) == NULL) 
	{
		printf("open file error!\n");
		return(-4);
	}
	
/*********组成报文头*******/
	lFileLen = GetFileLength(fp);
	memset((char*)&hFileHeader,0,sizeof(hFileHeader));
	memcpy(hFileHeader.cmd_code,"900011",6);
	strcpy(hFileHeader.scr_fname,scr_path);
	strcpy(hFileHeader.dest_fname,dest_path);
	sprintf(pszTemp,"%010ld",lFileLen);
	memcpy(hFileHeader.filelen,pszTemp,10);

	sprintf(pszTemp,"%010d",0);
	memcpy(hFileHeader.pstart,pszTemp,10);

	hFileHeader.trans_sign = 'D';
	sprintf(pszTemp,"%05d",max_buf_len);
	memcpy(hFileHeader.max_buf_len,pszTemp,5);

	iRet=iSendHeader(sock,&hFileHeader,timeout);
	if(iRet<0) 
	{
		fclose(fp);
		return(iRet);
	}
	
	j=0;		/*报文计数器*/
	do
	{
//		ULOG("fser.log","RecvFileDate!");
		iRet=iRecvFileData(sock,&hFileData,pszFileBuf,&iDataLen,timeout);
		if(iRet<0||iRet==10053) 
		{
			fclose(fp);
//			ULOG("fser.log","iRecvFileData error terry");
			return(iRet);
		}
		memcpy(pszFileOffset,hFileData.fileoffset,10);
		pszFileOffset[10]=0;
		lFileOffset=atol(pszFileOffset);
		if (lFileOffset!=ftell(fp))
		{
			printf("WriteFile error!\n");
			fclose(fp);
			return(-6);
		}
		fwrite(pszFileBuf,1,iDataLen,fp);
		
		if (hFileData.filedata_sign!='E')
		{
/*********组成OK响应包*******/
			memset((char*)&hRespond,0,sizeof(hRespond));
			memcpy(hRespond.cmd_code,"900011",6);
			memcpy(hRespond.filestatus,"OK",2);

/*******发送响应包***/
			iRet=iSendRespond(sock,&hRespond,timeout);
			if (iRet<0) 
			{ 	
				fclose(fp);
				return(iRet);
			}
		}
		if (j==49999) j=0;
		else	j++; 
	}while ((hFileData.filedata_sign!='E')&&(j<=MAX_BUF_NUM));	
	fclose(fp);
	return(0);
}	
 
int CFileProcess::PutFile(int iPort,char *ipAddress,char *src_path,char *dest_path,int max_buf_len)
{
	int 	iRet;
	iRet=SocketInit();
	if(iRet!=0)
	{
//		ULOG("fser.log","Init -1 terry");
		return -1;
	}
	iRet=ConnectFileHost(ipAddress,iPort);
	if(iRet!=0)
	{
//		ULOG("fser.log","connet -2 terry");
		return -2;
	}
	iRet=giPutFile(m_pFileSocket,src_path,dest_path,max_buf_len);
	AfterFile();
	if(iRet!=0)
	{
	}
	return iRet;
}
int CFileProcess::GetFile(int iPort,char *IpAddress,char *src_path,char *dest_path,int max_buf_len)
{
	int 	iRet;

//	ULOG("fser.log", "Connect init");
	iRet=SocketInit();
	if(iRet!=0)
	{
//		ULOG("fser.log","g Init -1 terry");

		return -1;
	}
	ULOG("fser.log", "Connect to host");
	iRet=ConnectFileHost(IpAddress,iPort);
	if(iRet!=0)
	{
//		ULOG("fser.log","g connet -2 terry");
		return -2;
	}
//	ULOG("fser.log", "Begin to Download!");
	iRet=giGetFile(m_pFileSocket,src_path,dest_path,max_buf_len);
	AfterFile();
	if(iRet!=0)
	{
		;
	} 
	return iRet;
}

extern "C" _declspec ( dllexport )
int tsfile(int flag,int iPort,char *IpAddress,char *src_path,char *dest_path,int max_len)
{
	CFileProcess m_file;
	int		ret;
	char szTemp[256];

	if(flag==0)//get file
	{
//		ULOG("fser.log", "Begin download...terry");
		sprintf(szTemp, "Port:[%d],IP:[%s],Src:[%s],Des:[%s]", iPort, IpAddress, src_path, dest_path);
//		ULOG("fser.log", szTemp);
//		sprintf(szTemp,"terry");
//		ULOG("fser.log",szTemp);
		ret=m_file.GetFile(iPort,IpAddress,src_path,dest_path,max_len);
		int i=0;
		while(i<5 && ret==10053)
		{
			Sleep(1000);
			sprintf(szTemp,"10053,try again more %d time,terry",i);
			ULOG("fser.log",szTemp);
			ret=m_file.GetFile(iPort,IpAddress,src_path,dest_path,max_len);
			i++;
		}

/*
		if(ret==10053)
		{
			Sleep(1000);
			sprintf(szTemp,"10053,try again,terry");
			ULOG("fser.log",szTemp);
			ret=m_file.GetFile(iPort,IpAddress,src_path,dest_path,max_len);

			if(ret==10053)
			{
				Sleep(1000);
				sprintf(szTemp,"10053,try again more time,terry");
				ULOG("fser.log",szTemp);
				ret=m_file.GetFile(iPort,IpAddress,src_path,dest_path,max_len);

				if(ret==10053)
				{
					Sleep(1000);
					sprintf(szTemp,"10053,try again more 2 times,terry");
					ULOG("fser.log",szTemp);
					ret=m_file.GetFile(iPort,IpAddress,src_path,dest_path,max_len);


				}

			}

		}
		*/
		return ret;
	}
	else 
	{
		ret=m_file.PutFile(iPort,IpAddress,src_path,dest_path,max_len);//putfile
		return ret;
	}
}	
	
		



















⌨️ 快捷键说明

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