⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hlistener.h

📁 积下的一点C++编程序库源码
💻 H
字号:
#ifndef  H_LISTENER_H
#define  H_LISTENER_H  1
//////////////////////////////////////////////////////////////////////////////


//文件名		: HListener.h

//功能			: 监听线程类,应用于Windows 和 Linux两种系统

//创建/修改日期	: 2003.11.27

//作者			: 韩国静
//

/////////////////////在指定的端口开始监听线程,每当有连接来到就调用回调函数/////////////////
#include "HTcpSock.h"
#include "UniThread.h"
#include "HListenerCall.h"
 class HListener
{
	UNI_Semaphore		m_Semaphore;

	UNI_ThreadHandle	m_RunThread;

	CHTcpSock			m_Sock;

	UNI_BOOL			m_Stop;

	void				*m_pCallParam;

	//UNI_BOOL			(*m_pDataCall)(CHTcpSock *pAccepted,void * dwCallParam);
	HLISTENERCALLBACK	m_pDataCall;

	static UNI_THREADPROC RecvThread(void * param)
	{
		CHTcpSock net;
		HListener*pThis=(HListener*)param;
		UNI_BOOL bConnect;
		if(pThis)
		{
			bConnect=net.AcceptConnect(&pThis->m_Sock);
			UNI_ReleaseSemaphore(pThis->m_Semaphore);
			if(bConnect)
			{
				pThis->m_pDataCall(&net,pThis->m_pCallParam);
				net.Close();
			}
		}
		UNI_ExitThread(0);
	};

	static UNI_THREADPROC RunThread(void * param)
	{
		UNI_ThreadHandle hThread;
		UNI_ThreadID     dwID;
		HListener*pThis=(HListener*)param;
		while(UNI_FALSE==pThis->m_Stop)
		{
			if(UNI_CreateThread(RecvThread,param,&hThread,&dwID))
			{
				UNI_CloseThreadHandle(hThread);
				UNI_WaitSemaphore(pThis->m_Semaphore);
			}
			else
				UNI_Sleep(20);
		}
		UNI_ExitThread(0);
	};

public:

	//在指定的端口开始监听线程,每当有连接来到就调用回调函数
	UNI_BOOL Start(UNI_IN HLISTENERCALLBACK pCall,UNI_IN void *pVoid,UNI_IN UNI_WORD wPort)
	{
		m_Stop=UNI_FALSE;
		m_pDataCall=pCall;
		m_pCallParam = pVoid;
		UNI_ThreadID dwId;
		if(m_pDataCall)
		{
			if(UNI_CreateSemaphore(&m_Semaphore,0))
			{
				if(m_Sock.ListenAt(wPort,200))
				{
					
	        		if(UNI_CreateThread(RunThread,this,&m_RunThread,&dwId))
						return UNI_TRUE;
					m_Sock.Close();
				}
				UNI_CloseSemaphore(m_Semaphore);
			}
		}
		m_Stop=UNI_TRUE;
		return UNI_FALSE;
	};

	//停止监听线程
	void End()
	{
		if(m_Stop==UNI_FALSE)
		{
			m_Stop=UNI_TRUE;
			m_Sock.Close();
			UNI_WaitCloseThread(m_RunThread);
			UNI_CloseSemaphore(m_Semaphore);
		}
	};

	///////////////////////////////////////////////////////////////////////
	HListener(void){};
	~HListener(void){};
};
#endif	//H_LISTENER_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -