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

📄 sendfile.cpp

📁 一个电视台专用的信息管理软件源代码
💻 CPP
字号:
#include "stdafx.h"
#include "SendFile.h"
#include <stdlib.h>
#include <stdio.h>


int ReadData(SOCKET s, void *buf, int len, int flags,int timeout)
{
	struct timeval		timeOut;
	fd_set	rfds;
	int		ret;
	FD_ZERO( &rfds );
	FD_SET( s, &rfds );

	timeOut.tv_sec  = timeout/1000;
	timeOut.tv_usec = timeout%1000;
	

	ret = select(0, &rfds, NULL, NULL, &timeOut);
	if( ret > 0 )
	{
		ret = recv(s, (char*)buf, len, flags);
		if(ret<=0)
		{
			ret = SOCKET_ERROR;
		}
	}
	else
	{
		::OutputDebugString("error\n");
	}

	return ret;
}



//返回所写数据的Size 否则返回值<0
int WriteData(SOCKET s, const void* buf, int len, int flags,int timeout)
{
	struct timeval		timeOut;
	fd_set	wfds;
	int		ret;
	FD_ZERO( &wfds );
	FD_SET( s, &wfds );

	timeOut.tv_sec = timeout/1000;
	timeOut.tv_usec = timeout%1000;
	ret = select(0, NULL, &wfds, NULL, &timeOut);
	if( ret > 0 )
	{
		ret = send(s, (const char*)buf, len, flags);
		if(ret==SOCKET_ERROR)
		{
			int nSocketError=WSAGetLastError();
			switch(nSocketError)
			{
			case WSAETIMEDOUT:
				::OutputDebugString("WSAETIMEDOUT\n");
				break;
			case WSAENOBUFS:
				::OutputDebugString("WSAENOBUFS\n");
				break;
			case WSAEINTR:
				::OutputDebugString("WSAEINTR\n");
				break;
			case WSAEACCES:
				::OutputDebugString("WSAEACCES\n");
				break;			
			case WSAENETDOWN:
				::OutputDebugString("WSAENETDOWN\n");
				break;

			case WSAEFAULT:
				::OutputDebugString("WSAEFAULT\n");
				break;
			case WSAENOTCONN:
				::OutputDebugString("WSAENOTCONN\n");
				break;
			case WSAECONNABORTED:
				::OutputDebugString("WSAECONNABORTED\n");
				break;
			}

		}
	}
	FD_CLR( s, &wfds );

	return ret;
}


BOOL CopySvrFile(const char *pSrcAddr,	//审片服务器地址
				 unsigned short nSrcPort,  //审片服务器端口号
				 const char *pSvrFileName,//审片服务器上文件名称,绝对路径
				 const char *pDestAddr,//串播服务器地址
				 unsigned short nDestPort,//串播服务器端口
				 const char *pDestPath,//串播服务器路径
				 BOOL	bDeleteSrcFile,//是否删除审片服务器文件
				 char *pErrorString,//错误提示信息
				 LPFN_SENDFILECALLBACK lpfnSendFileCallback//回调函数
				 )
{
	SOCKET	s=INVALID_SOCKET;
	sockaddr_in		sin;
	

	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	
	sin.sin_addr.S_un.S_addr = inet_addr(pSrcAddr);
	sin.sin_port = htons(nSrcPort);

	int nLen=0;

	__try
	{
		s = socket(PF_INET, SOCK_STREAM, 0);
		if( s != INVALID_SOCKET )
		{
		
			if( connect(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
			{
				sprintf(pErrorString,"connect error. ip=%s,errorcode=%x\n",pSrcAddr,WSAGetLastError());
				closesocket(s);
				return FALSE;
			}
		}

		FILE_SVR_HEADER FileSvrHeader;
		memset(&FileSvrHeader,0,sizeof(FileSvrHeader));
		strcpy(FileSvrHeader.szTag,FILE_HEADER_TAG);
		FileSvrHeader.nCommond = CMD_COPY_SVR_FILE;
		strncpy(FileSvrHeader.szFileName,pSvrFileName,sizeof(FileSvrHeader.szFileName));


		sprintf(FileSvrHeader.szReserved,"%s %s",pDestAddr,pDestPath);
		FileSvrHeader.nReserved = nDestPort;
		if(bDeleteSrcFile)
			FileSvrHeader.nReserved += 0x010000;


		//发送文件头
		if(WriteData(s,&FileSvrHeader,sizeof(FILE_SVR_HEADER),0,10000)!=sizeof(FILE_SVR_HEADER))
		{
			sprintf(pErrorString,"文件头发送失败[%s]!",pSvrFileName);
			return FALSE;
		}

		char szBuffer[512];
		while(nLen>=0)
		{
			nLen = ReadData(s,szBuffer,sizeof(szBuffer),0,5000);
			if(nLen>0&&nLen<sizeof(szBuffer)-1)
			{
				szBuffer[nLen]=0;
				if(memcmp(szBuffer,"len ",4)==0)
				{
					WriteData(s,"OK",2,0,5000);
					if(lpfnSendFileCallback!=NULL)
					{
						if(!lpfnSendFileCallback(&FileSvrHeader,_atoi64(szBuffer+4)))
						{
							return FALSE;
						}
					}				
				
				}
				printf("%s\n",szBuffer);

				if(memcmp(szBuffer,"OK",2)==0)
					break;
			}

		}

		if(memcmp(szBuffer,"OK",2)==0)
		{
			return TRUE;
		}
		else
		{
			strcpy(pErrorString,szBuffer);
			return FALSE;
		}
		
	}
	__finally
	{
		if(s!=INVALID_SOCKET)
		{
			closesocket(s);
		}


	}
	return FALSE;	

}


//删除服务器上文件,成功返回TRUE,否则为FALSE,出错时错误信息由,p文件ErrorString返回。
BOOL DeleteNewsFile(const char *pSvrAddr,  //服务器IP地址
						 unsigned short nPort,  //服务器端口号
						 const char *pSvrFileName,//服务器上文件名称,绝对路径
						 char *pErrorString//错误提示信息
						 )
{
	SOCKET	s=INVALID_SOCKET;
	sockaddr_in		sin;
	

	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	
	sin.sin_addr.S_un.S_addr = inet_addr(pSvrAddr);
	sin.sin_port = htons(nPort);

	int nLen=0;

	__try
	{
		s = socket(PF_INET, SOCK_STREAM, 0);
		if( s != INVALID_SOCKET )
		{
		
			if( connect(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
			{
				sprintf(pErrorString,"connect error. ip=%s,errorcode=%x\n",pSvrAddr,WSAGetLastError());
				closesocket(s);
				return FALSE;
			}
		}

		FILE_SVR_HEADER FileSvrHeader;
		memset(&FileSvrHeader,0,sizeof(FileSvrHeader));
		strcpy(FileSvrHeader.szTag,FILE_HEADER_TAG);
		FileSvrHeader.nCommond = CMD_DELETE_FILE;
		strncpy(FileSvrHeader.szFileName,pSvrFileName,sizeof(FileSvrHeader.szFileName));

		//发送文件头
		if(WriteData(s,&FileSvrHeader,sizeof(FILE_SVR_HEADER),0,10000)!=sizeof(FILE_SVR_HEADER))
		{
			sprintf(pErrorString,"6发送删除文件命令时失败[%s]!",pSvrFileName);
			return FALSE;
		}

		char szBuffer[512];
		nLen = ReadData(s,szBuffer,sizeof(szBuffer),0,5000);
		if(nLen<3)
		{
			sprintf(pErrorString,"删除服务器文件时失败[%s]!",pSvrFileName);
			return FALSE;
		}
		szBuffer[nLen]=0;
		if(strncmp(szBuffer,"OK",2)==0)
		{
			
			return TRUE;
		}
		else
		{
			strcpy(pErrorString,szBuffer);
			return FALSE;
		}
		
	}
	__finally
	{
		if(s!=INVALID_SOCKET)
		{
			closesocket(s);
		}


	}
	return FALSE;
}


BOOL SendNewsFile(const char *pSvrAddr,
				  unsigned short nPort,
				  const char *pLocalFileName,
				  FILE_SVR_HEADER *pFileSvrHeader,
				  char *pSvrFileName,
				  char *pErrorString,
				  int &FileSize,
				  LPFN_SENDFILECALLBACK lpfnSendFileCallback)
{

	SOCKET	s=INVALID_SOCKET;
	sockaddr_in		sin;
	

	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	
	sin.sin_addr.S_un.S_addr = inet_addr(pSvrAddr);
	sin.sin_port = htons(nPort);

	FILE *f=NULL;
	int nLen=0;

	__try
	{
		s = socket(PF_INET, SOCK_STREAM, 0);
		if( s != INVALID_SOCKET )
		{
		
			if( connect(s, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
			{
				sprintf(pErrorString,"connect error. ip=%s,errorcode=%x\n",pSvrAddr,WSAGetLastError());
				closesocket(s);
				return FALSE;
			}
		}
		
		f=fopen(pLocalFileName,"rb");
		if(f==NULL)
		{
			sprintf(pErrorString,"6本地文件打开失败[%s]!",pLocalFileName);
			return FALSE;
		}

		fseek(f,0,SEEK_END);
		pFileSvrHeader->nFileSize = ftell(f);
		pFileSvrHeader->nCommond  = CMD_SEND_FILE;
		strcpy(pFileSvrHeader->szTag,FILE_HEADER_TAG);
		fseek(f,0,SEEK_SET);
		
		if(WriteData(s,pFileSvrHeader,sizeof(FILE_SVR_HEADER),0,10000)!=sizeof(FILE_SVR_HEADER))
		{
			sprintf(pErrorString,"6本地文件头发送失败[%s]!",pLocalFileName);
			return FALSE;
		}

		char szBuffer[2048];
		__int64  nSendBytes=0;

/////////////////////////////////////////////////
		FileSize = (int)(pFileSvrHeader->nFileSize);
//      int pro_len = FileSize / 100 + 1;
//		int pos = 0;
////////////////////////////////////////////////

		BOOL bCancel=FALSE;
		while(!feof(f))
		{
			
			nLen = fread(szBuffer,1,sizeof(szBuffer),f);
			if(nLen>0)
			{
				if(WriteData(s,szBuffer,nLen,0,10000)!=nLen)
				{
					sprintf(pErrorString,"6本地数据发送失败[%s]!",pLocalFileName);
					return FALSE;
				}
				nSendBytes+=nLen;

//////////////////////////////////////////////////////
//				pos = (int)(nSendBytes / pro_len);
//				m_Progress.SetPos(pos);
//////////////////////////////////////////////////////

				if(lpfnSendFileCallback!=NULL)
				{//LPFN_SENDFILECALLBACK)(FILE_SVR_HEADER *pFileSvrHeader,__int64 nSendBytes
					if(!lpfnSendFileCallback(pFileSvrHeader,nSendBytes))
					{
						bCancel = TRUE;
						return FALSE;
					}
				}
								
			}
		}
		
		nLen = ReadData(s,szBuffer,sizeof(szBuffer),0,10000);
		if(nLen<3)
		{
			sprintf(pErrorString,"7读取服务器文件名时失败[%s]!",pLocalFileName);
			return FALSE;
		}
		szBuffer[nLen]=0;
		strcpy(pSvrFileName,szBuffer+2);

/*		if(bCancel)
		{
			WriteData(s,"cancel",6,0);
			return FALSE;
		}
		else
		{
			WriteData(s,"OK",2,0);
			return FALSE;

		}*/
		return TRUE;
		
	}
	__finally
	{
		if(s!=INVALID_SOCKET)
		{
			closesocket(s);
		}
		if(f!=NULL)
			fclose(f);

	}
	return FALSE;
}

⌨️ 快捷键说明

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