www.pudn.com > UDP文件传输.rar > ZsP2p.h
// ZsP2p.h: interface for the CZsP2p class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_)
#define AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//////////////////////////////////////////////////////////////////////////////
//文件名 : ZsP2p.h
//功能 : 中搜UDP文件传输上层接口实现示例
//创建 : 2004.11.14
//修改日期 : 2004.11.14
//作者 : 韩国静
//
#include "ZsP2pEventHandle.h"
#include "HFile.h"
#define P2PHOME "C:\\P2P"
class CZsP2p :public ZsP2pEventHandle
{
typedef struct MYDATA
{
bool bStart;
HFile file;
char pathName[MAX_PATH_NAME];
}*PMYDATA;
public:
CZsP2p(){};
virtual ~CZsP2p(){};
virtual void UI_UnInitialize(const PUI_FILEINFO pfile,UNI_OUT void * &pExtra)
{
PMYDATA pMyData;
if(pMyData=(PMYDATA)pExtra)
{
pMyData->file.Close();
delete pMyData;
}
}
virtual UNI_BOOL UI_Initialize(const PUI_FILEINFO pfile,UNI_OUT void * &pExtra,char *pathName)
{
PMYDATA pMyData;
if(pMyData= new MYDATA)
{
pExtra=pMyData;
pMyData->bStart=false;
memset(pMyData->pathName,0,sizeof(pMyData->pathName));
if(pathName)
strncpy(pMyData->pathName,pathName,sizeof(pMyData->pathName));
return UNI_TRUE;
}
return UNI_FALSE;
}
virtual void UI_OnFileRefuse(const PUI_FILEINFO pfile)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
//服务通知文件不能发送!
printf("送给%s的文件%s被对方拒绝\r\n",pfile->sendName,pMyData->pathName);
}
virtual UNI_BOOL UI_OnFileReq(const PUI_FILEINFO pfile,UNI_OUT UNI_DWORD &dwOffset,UNI_OUT void * &pExtra)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData==UNI_NULL)
pMyData= new MYDATA;
if(pMyData)
{
pExtra=pMyData;
dwOffset=0;
pMyData->bStart=false;
sprintf(pMyData->pathName,"%s\\%s",P2PHOME,pfile->fileName);
if(dwOffset==0)
{
pMyData->file.CreateNew(pMyData->pathName);
}
else
pMyData->file.OpenForReadWrite(pMyData->pathName);
printf("$: %s发来文件%s,另存为%s开始接收......\r\n",pfile->sendName,pfile->fileName,pMyData->pathName);
return UNI_TRUE;
}
printf("$: %s发来文件%s,内存不足以后下载!!!!!!!!!!!!!!!!!!!\r\n",pfile->sendName,pfile->fileName);
return UNI_FALSE;
}
virtual void UI_OnCancelBySend(const PUI_FILEINFO pfile)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
printf("$: 文件%s已被发送方%s取消\r\n",pMyData->pathName,pfile->sendName);
}
virtual void UI_OnCancelByRecv(const PUI_FILEINFO pfile)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
if(pMyData->bStart==true)
{
printf("$: 文件%s已被接收方%s取消\r\n",pMyData->pathName,pfile->sendName);
}
else
{
UI_OnFileRefuse(pfile);
}
}
virtual void UI_OnSendOver(const PUI_FILEINFO pfile)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
printf("给%s的文件%s传输成功结束!\r\n",pfile->sendName,pMyData->pathName);
}
virtual void UI_OnRecvOver(const PUI_FILEINFO pfile)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
printf("来自%s的文件%s传输成功结束!\r\n",pfile->sendName,pMyData->pathName);
}
virtual void UI_OnRecvTimeOut(const PUI_FILEINFO pfile)
{
//只对UDP_FILE_NEXT超时
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
printf("网络超时!来自%s的文件%s传输失败!\r\n",pfile->sendName,pMyData->pathName);
}
virtual void UI_OnSendTimeOut(const PUI_FILEINFO pfile)
{
//只对UDP_CLIENT_FILE_REQ超时
//
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
if(pMyData->file.IsOpened())
pMyData->file.Close();
printf("网络超时!给%s的文件%s无法传输!\r\n",pfile->sendName,pMyData->pathName);
}
virtual UNI_BOOL UI_OnSaveData(const PUI_FILEINFO pfile,UNI_DWORD offset,UNI_DWORD size,void *data)
{
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
pMyData->bStart=true;
printf("来自%s的文件%s当前进度为 received %d:%d 字节!\r\n",pfile->sendName,pMyData->pathName,offset+size,size);
if(!pMyData->file.IsOpened())
{
pMyData->file.OpenForReadWrite(pMyData->pathName);
}
if(pMyData->file.IsOpened())
{
if(size!=(UNI_DWORD)pMyData->file.WriteAt(data,size,offset))
{
return UNI_FALSE;
}
}
else
return UNI_FALSE;
return UNI_TRUE;
}
virtual int UI_OnReadData(const PUI_FILEINFO pfile,UNI_DWORD offset,UNI_DWORD size,void *data)
{
int ret=-1;
PMYDATA pMyData=(PMYDATA)pfile->pExtra;
pMyData->bStart=true;
if(!pMyData->file.IsOpened())
{
pMyData->file.OpenForRead(pMyData->pathName);
}
if(pMyData->file.IsOpened())
{
ret= pMyData->file.ReadAt(data,size,offset);
}
printf("给%s的文件%s当前进度为 sended %d:%d 字节!\r\n",pfile->sendName,pMyData->pathName,offset,ret);
return ret;
}
virtual void UI_OnBadError(const PUI_FILEINFO pfile)
{
printf("because memory out\r\n");
}
};
#endif // !defined(AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_)