📄 sendfile.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 + -