www.pudn.com > UDP文件传输.rar > ZsProxySvr.h


// ZsProxySvr.h: interface for the CZsProxySvr class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_ZSPROXYSVR_H__3CF2E79A_D3AC_470D_94AF_DF1E65204AB6__INCLUDED_) 
#define AFX_ZSPROXYSVR_H__3CF2E79A_D3AC_470D_94AF_DF1E65204AB6__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
#include "HList.h" 
#include "HMutex.h" 
#include "../public/zs_p2pfilecmd.h" 
#include "HThread.h" 
struct UDP_SVRBUF 
{ 
	UDPFILE_CMD cmd; 
	char buf[MIN_PACK_SIZE-sizeof(UDPFILE_CMD)]; 
}; 
class IZsProxySvr 
{ 
	virtual void SendTo(UDPFILE_CMD *cmd)=0; 
public: 
	void AddToCmdList(UDP_SVRBUF *pcmd){SendTo(&pcmd->cmd);} 
	UNI_BOOL StartWork(){return UNI_TRUE;} 
	void StopWork(){} 
}; 
class CZsProxySvr:public IThreadRun   
{ 
	UNI_BOOL			m_bRun; 
	UNI_DWORD			m_CmdCount; 
	CHList	m_CmdList; 
	CHMutex				m_Mutex; 
	UNI_Semaphore		m_Semaphore; 
	CHThread			m_thread; 
#define MAX_CMD_COUNT (1024*128) 
 
protected: 
	virtual void SendTo(UDPFILE_CMD *cmd)=0; 
	virtual void Run(HCurrentThread ¤tThread) 
	{ 
		UDP_SVRBUF*pNode; 
		CHList::HLISTPOSTION pos; 
		while(m_bRun) 
		{ 
			while(pos=m_CmdList.MoveToBegin()) 
			{ 
				while(pNode=m_CmdList.MoveToNext(pos)) 
				{ 
					if(m_bRun==UNI_FALSE) 
						return; 
					SendTo(&pNode->cmd); 
					m_Mutex.Lock(); 
					m_CmdList.Remove(pNode); 
					if(m_CmdCount) 
							m_CmdCount--; 
					m_Mutex.UnLock(); 
				} 
			} 
			UNI_WaitSemaphore(m_Semaphore); 
		} 
	} 
 
public: 
	CZsProxySvr() 
	{ 
		m_CmdCount=0; 
	}; 
	virtual ~CZsProxySvr(){}; 
 
	void AddToCmdList(UDP_SVRBUF *pcmd) 
	{ 
		UDP_SVRBUF *pNode; 
		m_Mutex.Lock(); 
		if(this->m_CmdCountcmd.head.other_len+pcmd->cmd.head.user_data_len+sizeof(pcmd->cmd.head)); 
				m_CmdCount++; 
				UNI_ReleaseSemaphore(m_Semaphore); 
			} 
		} 
		m_Mutex.UnLock(); 
		 
	} 
	UNI_BOOL StartWork() 
	{ 
		this->m_bRun=UNI_TRUE; 
		 
		if(UNI_CreateSemaphore(&m_Semaphore,0)) 
		{ 
			if(m_thread.Run(this)) 
				return UNI_TRUE; 
			UNI_CloseSemaphore(m_Semaphore); 
		} 
		return UNI_FALSE; 
	} 
	void StopWork() 
	{ 
		this->m_bRun=UNI_FALSE; 
		UNI_ReleaseSemaphore(m_Semaphore); 
		this->m_thread.Join(); 
		UNI_CloseSemaphore(m_Semaphore); 
	} 
}; 
 
#endif // !defined(AFX_ZSPROXYSVR_H__3CF2E79A_D3AC_470D_94AF_DF1E65204AB6__INCLUDED_)