www.pudn.com > UDP文件传输.rar > libzsp2p.cpp
#include "libzsp2p.h"
#include "ZsP2PBlock.h"
////////////////////////////////////////////////////////////////////
//
//
//
///////////////////////////////////////////////////////////////////////
struct InetP2pHandle
{
UNI_DWORD dwSvrIp;
UNI_WORD wSvrPort;
};
static CZsP2pBlock* g_p2p=UNI_NULL;
static UNI_DWORD g_p2pRef=0;
HP2P P2p_Open(ZsP2pEventHandle *pEvent,char *username,UNI_DWORD dwSvrIp,UNI_WORD dwSvrPort,UNI_WORD dwLocalPort)
{
return P2p_OpenEx(pEvent,username,dwSvrIp,dwSvrPort,dwLocalPort,0);
}
HP2P P2p_OpenEx(ZsP2pEventHandle *pEvent,char *username,UNI_DWORD dwSvrIp,UNI_WORD dwSvrPort,UNI_WORD dwLocalPort,UNI_DWORD dwLocalIp)
{
CZsP2pBlock* p2p;
InetP2pHandle *phandle;
if(phandle= new InetP2pHandle)
{
phandle->dwSvrIp=dwSvrIp;
phandle->wSvrPort=dwSvrPort;
p2p=g_p2p;
if(p2p==UNI_NULL)
{
p2p=CZsP2pBlock::_Open(pEvent,username,dwLocalPort,dwLocalIp);
}
if(p2p)
{
if(p2p->EnableRecvFrom(dwSvrIp,dwSvrPort))
{
g_p2pRef++;
g_p2p=p2p;
return (HP2P)phandle;
}
if(p2p!=g_p2p)//新的
{
p2p->Close();
}
}
delete phandle;
}
return UNI_NULL;
}
void P2p_Close(HP2P hP2p)
{
delete (InetP2pHandle *)hP2p;
g_p2pRef--;
if(g_p2pRef==0)
{
g_p2p->Close();
g_p2p=UNI_NULL;
}
}
UNI_BOOL P2p_StartSend(HP2P hP2p,UNI_DWORD dwFileID,char *fileName,UNI_DWORD dwFileSize,char *toWho,char *pathName)
{
CZsP2pBlock *p2p;
InetP2pHandle *phandle;
if(phandle=(InetP2pHandle *)hP2p)
{
if(p2p=g_p2p)
{
if(p2p->CreateSendCanal(dwFileID,fileName,dwFileSize,toWho,pathName,phandle->dwSvrIp,phandle->wSvrPort))
{
if(p2p->UserStartSend(dwFileID,toWho))
return UNI_TRUE;
p2p->DestorySendCanal(dwFileID,toWho);
}
}
}
return UNI_FALSE;
}
void P2p_CancelSend(HP2P hP2p,UNI_DWORD dwFileID,char *toWho)
{
CZsP2pBlock *p2p;
InetP2pHandle *phandle;
if(phandle=(InetP2pHandle *)hP2p)
{
if(p2p=g_p2p)
{
p2p->UserCancelSend(dwFileID,toWho);
}
}
}
UNI_BOOL P2p_StartRecv(HP2P hP2p,UNI_DWORD dwFileID,char *fromWho,char *fileName,char *pathName,UNI_DWORD dwStartOffset)
{
CZsP2pBlock *p2p;
if(hP2p)
{
if(p2p=g_p2p)
{
return p2p->UserStartRecv(dwFileID,fromWho,fileName,pathName,dwStartOffset);
}
}
return UNI_FALSE;
}
void P2p_CancelRecv(HP2P hP2p,UNI_DWORD dwFileID,char *fromWho)
{
CZsP2pBlock *p2p;
if(hP2p)
{
if(p2p=g_p2p)
{
p2p->UserCancelRecv(dwFileID,fromWho);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
//
//
//
//
///////////////////////////////////////////////////////////////////////////////////////////////