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

📄 cfile.cpp

📁 unix下的C语言文件传输服务器端源程序文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************
 * 和文件server进程通讯传文件
 *********************************************************************/
#include	"stdafx.h"
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include "tsfile.h"
#include "fser.h"
#include "winsock.h"
//#define CYC

#define	 CONTINUERECV 9999
#define  TIMEOUT      60




int	FileTrace(char *pszStr)
{
	return 0;
}
/***********************************************************************
*	编    号:
*       函 数 名: long GetFileLength(FILE *fp)
*    	文 件 名: file_tools.c
*       入口参数: 	fp 	:文件指针;
*
*	返回参数: 	
*       修改全局变量:
*       父 函 数:
*       子 函 数:
*       访问数据:
*       函数功能: 取文件长度
*********************************************************************/
long GetFileLength(FILE *fp)
{
	long lOld_Offset,lTemp_Offset;
	
	lOld_Offset = ftell(fp);
	fseek(fp, 0L, SEEK_END);
	lTemp_Offset = ftell(fp);
	fseek(fp, lOld_Offset, SEEK_SET);
	return(lTemp_Offset);
}
/***********************************************************************
*	编    号:
*       函 数 名: void AddBufLen(char *Buf,int *BufLen)
*    	文 件 名: file_tools.c
*       入口参数: 	Buf 	:字符串指针;
*			Buflen  :字符串长度; 
*
*	返回参数: 	Buf 	:字符串指针;
*			Buflen  :字符串长度;
*       修改全局变量:
*       父 函 数:
*       子 函 数:
*       访问数据:
*       函数功能: 前五位为字符串的长度,通过前五位取字符串。
*********************************************************************/
void AddBufLen(char *Buf,int *BufLen)
{
	char pszTmp[DATA_LEN+1];
	char pszTmpLen[5];

	
	memcpy(pszTmp,Buf,*BufLen);
	sprintf(pszTmpLen,"%04d",*BufLen);
	*BufLen += 4;
	memcpy(Buf,pszTmpLen,4);
	memcpy(Buf+4,pszTmp,*BufLen-4);
	Buf[*BufLen]=0;
	return;
}

int DelBufLen(char *Buf,int *BufLen)
{
	char pszTmp[DATA_LEN+1];
	char pszTmpLen[5];
	int  iLen;
	
	memcpy(pszTmpLen,Buf,4);
	pszTmpLen[4]=0;
	iLen = atoi(pszTmpLen);
	if (iLen + 4 > *BufLen )
	{
		printf("RecvLen less than Buf length or other error Buflen=[%d]",*BufLen);
		return(-1);
	}
	memcpy(pszTmp,Buf+4,iLen);
	memcpy(Buf,pszTmp,iLen);
	*BufLen = iLen;
	Buf[*BufLen]=0;
	return(0);
}

//Name			:ULOG
//Description	:调试记信息
//Input			:tempbuf 日志内容
//Output        :日志文件
//Return		:0成功,1 失败
//Remark		:如果路径错误的话,例如文件夹不存在,记日志时创建文件会失败.
void ULOG(char* fileName, char* tempbuf)
{
	
    CFile LogFile;
	char szTemp[256],szTime[50];
	CString csPath;
	csPath = fileName;
	
	if(!LogFile.Open(csPath,CFile::modeWrite |
		CFile::typeBinary | CFile::shareDenyNone) )
	{//试着创建
		if(!LogFile.Open(csPath,CFile::modeCreate |CFile::modeWrite))
		{//打开失败
			
			csPath+=" 打开失败";
			AfxMessageBox(csPath,MB_OK,NULL);
			return;
		}
	}
	
	memset(szTime,0,20);
	CTime time = CTime::GetCurrentTime();
	strcpy(szTime,time.Format( "%A, %B %d, %Y,%H:%M:%S" ).LockBuffer());
	
	LogFile.SeekToEnd();
	
	memset(szTemp,0,100);
	
	sprintf(szTemp, "\r\n%s:%s", szTime, tempbuf);
	
	LogFile.Write(szTemp, strlen(szTemp));
	LogFile.Close();
	return;
}

//======================================================================
int CFileProcess::SocketInit()
{
	int	e_code = 0;
	WSADATA wsaData;

	if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) 
	{
		e_code = WSAGetLastError();
		TRACE("WSAStartup failed with error %d\n",e_code);
		return (ERR_TCPWSASTARTUP);
	}
	return(ERR_OK);
	
}
CFileProcess::CFileProcess()
{
}
CFileProcess::~CFileProcess()
{
}
int CFileProcess::ConnectFileHost(char* address, short port)
{
	int e_code=0;
	struct sockaddr_in server;
	unsigned long	mode = SOCKET_ASYNCHRONOUS;

	m_pFileSocket = socket(AF_INET,PROTOCOL,0); /* Open a socket */
	if (m_pFileSocket <0 ) 
	{
		e_code = WSAGetLastError();
		printf("Client: Error Opening socket: Error %d\n",e_code);
		return (ERR_TCPCREATSOCKET);
	}
	
	memset(&server,0,sizeof(server));
	server.sin_family=AF_INET;
	server.sin_port=htons(port);
	server.sin_addr.s_addr=inet_addr(address);


	if (connect(m_pFileSocket,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
	{
		e_code = WSAGetLastError();
		printf("connect() failed: %d\n",e_code);
		closesocket(m_pFileSocket);
		e_code = WSACleanup();
		return (ERR_TCPCONNECT);
	}

	e_code = ioctlsocket(m_pFileSocket,FIONBIO, &mode);
	if(e_code)
	{
		e_code = WSAGetLastError();
		printf("bind() failed with error %d\n",e_code);
		closesocket(m_pFileSocket);
		e_code = WSACleanup();
		return (ERR_TCPIOCTLSOCKET);
	}
	printf("Socket Init Successful\n");
	return  ERR_OK;

}
int CFileProcess::FileWrite(SOCKET tcpsocket,char* wtbuf,int buflen)
{
	int rlt,e_code;

	rlt = send (tcpsocket,wtbuf,buflen,0); 
	switch(rlt)
	{
		case SOCKET_ERROR:
			 e_code = WSAGetLastError();
			 printf("send() failed: %d\n",e_code);
			 e_code = ERR_TCPSEND;
			 break;
		default:
			 if(rlt < buflen)
				 e_code = ERR_TCPSENDNOTALL;
			 else
				 e_code = ERR_OK;
	}
	
	return(e_code);
	
}
int CFileProcess::FileRead(SOCKET tcpsocket,char* rdbuf,int* buflen)
{
	int rlt = 0,e_code = 0;
	int i=0;
	int j=0;
	char	pszLen[5];
	int	len;
	char	pszTmpbuf[MAX_MSGLEN+1];
	
	
	while(i<TIMEOUT*10)//60秒超时
	{
		memset(pszTmpbuf,0x00,MAX_MSGLEN);
		rlt = recv(tcpsocket,pszTmpbuf,MAX_MSGLEN,0);
		switch(rlt)
		{
			case SOCKET_ERROR:
				 e_code = ERR_TCPRECEIVE;
				 // if(i==100)ULOG("fser.log","terry   ERR_TCPRECEIVE    ERR_TCPRECEIVE    100");
				 //char tmpstr[100];
				 //sprintf(tmpstr,"terry   ERR_TCPRECEIVE    ERR_TCPRECEIVE    %d",i);
				 //if(i>598) ULOG("fser.log",tmpstr);
				 
				 break;
			case 0:
				 e_code = ERR_TCPCONNECT;
				 //if(i>598) ULOG("fser.log","terry   ERR_TCPCONNECT    ERR_TCPCONNECT    ");
				 break;
			default:
				switch(j)
				{
				case 0:
					memcpy(pszLen,pszTmpbuf,4);
					pszLen[4]=0;
					len=atoi(pszLen);
					if(len+4>rlt)
					{
						memcpy(rdbuf,pszTmpbuf,rlt);
						rdbuf[rlt]=0;
						e_code =CONTINUERECV;//WSANOTINITIALISED
						j=rlt;

					}
					else
					{
						memcpy(rdbuf,pszTmpbuf,rlt);
						*buflen=rlt;
						e_code= ERR_OK;
					}
					break;
				default:
					memcpy(rdbuf+j,pszTmpbuf,rlt);
					j+=rlt;
					if(len+4>j)
					{
						e_code =CONTINUERECV;
					}
					else
					{
						e_code = ERR_OK;
						*buflen=j;
					}
					break;
				}
				
		}
		if(e_code==CONTINUERECV)
		{
			Sleep(100);
			i++;
			continue;

		}
		if(e_code!=ERR_OK)
		{
			e_code=WSAGetLastError();
			//char tmpstr[100];
			//sprintf(tmpstr,"terry   ERR_TCPRECEIVE    ERR_TCPRECEIVE    %d ecode=%d",i,e_code);
			//if(i>598) ULOG("fser.log",tmpstr);
			if(e_code==10053)
				return e_code;
			Sleep(100);
			i++;
			continue;
		}
		else
		{
			//printf("recv timeout()=[%d]",e_code);
//			char tmpstr[256];
//			sprintf(tmpstr,"terry recv break..........=[%d]",e_code);
//			ULOG("fser.log",tmpstr);

//			FileTrace(rdbuf);
			break;
		}
	}//while
	if(i>=TIMEOUT*10)
	{
//		FileTrace("RECV TIME OUT");
	}
	char tmpstr[256];
	sprintf(tmpstr,"ReadFile return..........=[%d]",e_code);
//	ULOG("fser.log",tmpstr);
	return(e_code);
	
}
void CFileProcess::AfterFile()
{
	WSACleanup();
	closesocket(m_pFileSocket);
}

int CFileProcess::iSendHeader(SOCKET iSockfd,struct FILEHEADER *pFileHeader,int timeout)
{
	char 	pszSendBuf[DATA_LEN+1];
        int 	iSendLen,iRet;
        
	memset(pszSendBuf,0,sizeof(pszSendBuf));
	memcpy(pszSendBuf,pFileHeader->cmd_code,6);
	memcpy(pszSendBuf+6,pFileHeader->scr_fname,80);
	memcpy(pszSendBuf+86,pFileHeader->dest_fname,80);
	memcpy(pszSendBuf+166,pFileHeader->filelen,10);
	memcpy(pszSendBuf+176,pFileHeader->pstart,10);
	pszSendBuf[186]=pFileHeader->trans_sign;
	memcpy(pszSendBuf+187,pFileHeader->max_buf_len,5);
	
	iSendLen = sizeof(*pFileHeader);
	pszSendBuf[iSendLen]=0;
	AddBufLen(pszSendBuf,&iSendLen);
	
#ifdef DEBUGON
printf("Sending len=[%ld]",iSendLen);
for (i=0;i<iSendLen;i++)
{	
	if ((i % 80)==0 ) printf("\n");
	printf("%c",pszSendBuf[i]);
	
}
#endif	
	
        iRet=FileWrite(iSockfd,pszSendBuf,iSendLen);
        if(iRet!=0)
        {
                printf("Write error, Send Header errno=[%d]\n",WSAGetLastError());
                return(-10);
        }
        return(0);
}	

int CFileProcess::iRecvHeader(SOCKET iSockfd,struct FILEHEADER *pFileHeader,int timeout)
{
	
	
	int	iRecvLen,iRet;
	char	pszRecvBuf[DATA_LEN+1];

	iRecvLen=0;						
	memset(pszRecvBuf,0,sizeof(pszRecvBuf));
	iRet=FileRead(iSockfd,pszRecvBuf,&iRecvLen);
	if(iRet!=0)
	{
		printf("line=[%d] read error iLen=[%d]",__LINE__,iRecvLen);
		return(-20);
	}
	pszRecvBuf[iRecvLen]=0;
	iRet=DelBufLen(pszRecvBuf,&iRecvLen);
	if (iRet<0) return(-21);
	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("Recv Header error !");
		return(-22);
	}
	return(0);
}

int CFileProcess::iSendRespond(SOCKET iSockfd,struct RESPONSE *pRespond,int timeout)
{
	char 	pszSendBuf[DATA_LEN+1];
        int 	iSendLen;
		int	iRet=0;
        
	memcpy(pszSendBuf,pRespond->cmd_code,6);
	memcpy(pszSendBuf+6,pRespond->filestatus,5);
	iSendLen = sizeof(*pRespond);
	AddBufLen(pszSendBuf,&iSendLen);
	
        iRet=FileWrite(iSockfd,pszSendBuf,iSendLen);
        if(iRet!=0)
        {
        	printf("Write error, Send Respond errno=[%d]\n",WSAGetLastError());
                return(-30);
        }
	return(0);
}

int CFileProcess::iRecvRespond(SOCKET iSockfd,struct RESPONSE *pRespond,int timeout)
{
	int	iRecvLen,iRet;
	char	pszRecvBuf[DATA_LEN+1];
	
/******add 20030917******************/
  	char	pszRet[4];
/********/
	
	iRecvLen=0;						
	memset(pszRecvBuf,0,sizeof(pszRecvBuf));
	iRet=FileRead(iSockfd,pszRecvBuf,&iRecvLen);
	if(iRet!=0)
	{
		printf("line=[%d] read error iLen=[%d]",__LINE__,iRecvLen);
		return(-40);
	}
	pszRecvBuf[iRecvLen]=0;
	iRet=DelBufLen(pszRecvBuf,&iRecvLen);
	if (iRet<0) return(-41);
	memset((char*)pRespond,0,sizeof(*pRespond));
	memcpy(pRespond->cmd_code,pszRecvBuf,6);
	memcpy(pRespond->filestatus,pszRecvBuf+6,5);

⌨️ 快捷键说明

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