📄 cfile.cpp
字号:
/*********************************************************************
* 和文件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 + -