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_)