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); 
		} 
	} 
} 
 
/////////////////////////////////////////////////////////////////////////////////////////////// 
// 
// 
// 
// 
///////////////////////////////////////////////////////////////////////////////////////////////