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

📄 eroomnetsession.cpp

📁 network library that can be use all network application!
💻 CPP
字号:
#include <stdio.h>
#include <time.h>
#include "EroomNetSession.h"

extern "C" {
	static DWORD WINAPI EroomSessionPollingProc(LPVOID Param);
};

CEroomNetSession::CEroomNetSession() : CWiseNet(WN_QUEUE_NOUSE)
{
	mp_EroomSessionRecvFunc = NULL;

	m_Code[0] = 'E';
	m_Code[1] = 'S';
	m_Code[2] = '0';

	m_PollTime = ES_POLLTIME;
	m_PollFlag = 0;
	m_TimeOutFlag = 0;

}

CEroomNetSession::~CEroomNetSession()
{
	EndPolling();
	mp_EroomSessionRecvFunc = NULL;
}

int CEroomNetSession::Send(char *ap_Ip, int a_Port, int a_Command, int a_Option)
{
	ES_PACKET		w_Packet;

	memset(&w_Packet, 0x00, ES_PACKET_SIZE);

	w_Packet.m_Code[0] = m_Code[0];
	w_Packet.m_Code[1] = m_Code[1];
	w_Packet.m_Check = ES_PACKET_ONLY;
	w_Packet.m_Sequence = 0;
	w_Packet.m_Cmd = a_Command;
	w_Packet.m_Cmd = a_Option;

	return(Send(ap_Ip, a_Port, &w_Packet));
}

int CEroomNetSession::Send(char *ap_Ip, int a_Port, ES_PACKET *ap_Packet)
{
	return(CWiseNet::Send(ap_Ip, a_Port, (char *)ap_Packet, ES_PACKET_SIZE));
}

int	CEroomNetSession::Recv(char *ap_Ip, int &ar_Port, char *ap_Buff, int &ar_Len)
{
	int				w_Rtn;
	ES_PACKET		*wp_RPacket;
	EROOMIPLIST		*wp_IpList;

	w_Rtn = CWiseNet::Recv(ap_Ip, ar_Port, ap_Buff, ar_Len, m_WaitFlag);
	if(w_Rtn <= 0) {
		return(w_Rtn);
	}
	if(ar_Len < ES_PACKET_SIZE) {
		return(0);
	}
	wp_RPacket = (ES_PACKET *)ap_Buff;

	if(wp_RPacket->m_Code[0] != m_Code[0] || wp_RPacket->m_Code[1] != m_Code[1]) {
		return(0);
	}
	if(!(wp_RPacket->m_Check & ES_PACKET_ONLY)){
		return(0);
	}
	switch(wp_RPacket->m_Cmd) {
		case ES_CMD_POLL : // POLL捞 柯版快 ==> 秦寸 IP/PORT ==> CONNECT肺
			wp_IpList = Find(ap_Ip, ar_Port);
			if(wp_IpList) {
				if(wp_IpList->m_Status&ES_ST_RECONNECT) {	// 犁 楷搬阑 盔且 版快 
					wp_IpList->m_Status &= ~EI_ST_TIMEOUT;
					wp_IpList->m_Status &= ~EI_ST_DISCONNECTED;
					wp_IpList->m_Status |= EI_ST_CONNECTED;
				}
				wp_IpList->m_Count = 0;
			}
		return(0);
	}

	if(mp_EroomSessionRecvFunc) {
		mp_EroomSessionRecvFunc(ap_Ip, ar_Port, wp_RPacket->m_Cmd, wp_RPacket->m_Option);
	}

	return(0);
}


extern "C" {
	DWORD WINAPI EroomNetSessionRecvProc(LPVOID Param);
	int	         EroomNetSessionRecvFunc(char *ap_Ip, int a_Port, char *ap_Buff, int w_Len);
};

int	EroomNetSessionRecvFunc(char *ap_Ip, int a_Port, char *ap_Buff, int w_Len)
{
	return(1);
}

int CEroomNetSession::SetRecvFunc(int (*ap_RecvFunc)(char *ap_Ip, int ar_Port, int a_Command, int a_Option))
{
	DWORD		IDThread;
	HANDLE		hThread;

	if(!m_RecvFunc && ap_RecvFunc) {
		m_RecvFlag = 1;
		m_RecvFunc = EroomNetSessionRecvFunc;
		mp_EroomSessionRecvFunc = ap_RecvFunc;

		m_HEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
		hThread = ::CreateThread(NULL, 0, EroomNetSessionRecvProc, this, 0, &IDThread);
		if(!hThread) {
			SetEvent(m_HEvent);
			CloseHandle(m_HEvent);
			m_HEvent = NULL;
			m_RecvFlag = 0;
			m_RecvFunc = NULL;
			return(-1);
		}
	} else if(m_RecvFunc && !ap_RecvFunc) {
		m_RecvFlag = 0;

		if(m_HEvent) {
			MSG		w_Msg;
			if(::PeekMessage(&w_Msg, NULL, 0, 0, PM_REMOVE)) {
				if (w_Msg.message != WM_QUIT) {
					::TranslateMessage(&w_Msg);
					::DispatchMessage(&w_Msg);
				}
			}

			WaitForSingleObject(m_HEvent, WN_KILLWAITTIME);
			CloseHandle(m_HEvent);
			m_HEvent = NULL;
		}
		EndPolling();
	}

	return(1);
}


extern "C" DWORD WINAPI EroomNetSessionRecvProc(LPVOID Param)
{
	int			w_Flag = 0;
	int			w_Port;
	char		w_Ip[256];
	char		w_Buff[WN_MAX_RECVLEN+WN_MAX_RECVLEN];
	int			w_Len;
	int			w_Rtn;
	char		w_IpBuff[100];
	EROOMIPLIST *wp_IpList;
	CEroomNetSession	*wp_EroomNetSession = (CEroomNetSession *)Param;

	while(wp_EroomNetSession->m_RecvFlag) {
		w_Rtn = wp_EroomNetSession->Recv(w_Ip, w_Port, w_Buff, w_Len);
		if(w_Rtn < 0) {
//			printf("Getting Error\n");
//			printf("Open : 1, Send : 2, Close : 3, Wait Flag(Sending):4 QUIT: Q,q!!!!\n");
		} else if(w_Rtn > 0) {
			wp_EroomNetSession->m_RecvFunc(w_Ip, w_Port, w_Buff, w_Len);
//			printf("Dada : (%s), Ip : (%s)\n", w_Ip, w_Buff);
//			printf("Open : 1, Send : 2, Close : 3, Wait Flag(Sending):4 QUIT: Q,q!!!!\n");
//		} else {
//			printf("Data Nothing\n");
//			printf("Open : 1, Send : 2, Close : 3, Wait Flag(Sending):4 QUIT: Q,q!!!!\n");
		}
		if(wp_EroomNetSession->m_TimeOutFlag) {	// TIME OUT REPORT
			wp_EroomNetSession->m_TimeOutFlag = 0;
	
			wp_EroomNetSession->StartCSection();
			wp_IpList = wp_EroomNetSession->Head();
			while(wp_IpList) {
				if(wp_IpList->m_Status & EI_ST_TIMEOUT) {
					sprintf(w_IpBuff, "%d.%d.%d.%d", 
						((char *)wp_IpList->m_Ip)[0]&0x0ff, 
						((char *)wp_IpList->m_Ip)[1]&0x0ff, 
						((char *)wp_IpList->m_Ip)[2]&0x0ff, 
						((char *)wp_IpList->m_Ip)[3]&0x0ff);

					wp_IpList->m_Status &= ~EI_ST_TIMEOUT;
					wp_IpList->m_Status |= ES_ST_DISCONNECTED;

					if(wp_EroomNetSession->mp_EroomSessionRecvFunc) {
						wp_EroomNetSession->mp_EroomSessionRecvFunc(w_IpBuff, wp_IpList->m_Port, ES_ST_TIMEOUT, 0);
					}
				}
				wp_IpList = wp_IpList->mp_Next;
			}
			wp_EroomNetSession->EndCSection();
		}
		

		Sleep(1);
	}
	SetEvent(wp_EroomNetSession->m_HEvent);
	wp_EroomNetSession->m_RecvFlag = 0;
	wp_EroomNetSession->m_RecvFunc = NULL;
	wp_EroomNetSession->mp_EroomSessionRecvFunc = NULL;
	return(1);
}

int CEroomNetSession::StartPolling()
{
	DWORD		IDThread;
	HANDLE		hThread;

	if(!m_PollFlag) {
		m_PollFlag = 1;

		m_PEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
		hThread = ::CreateThread(NULL, 0, EroomSessionPollingProc, this, 0, &IDThread);
		if(!hThread) {
			SetEvent(m_PEvent);
			CloseHandle(m_PEvent);
			m_PEvent = NULL;
			m_PollFlag = 0;
			return(-1);
		}
	}
	return(1);
}

int CEroomNetSession::EndPolling()
{
	m_PollFlag = 0;

	if(m_PEvent) {
		WaitForSingleObject(m_PEvent, WN_KILLWAITTIME);
		CloseHandle(m_PEvent);
		m_PEvent = NULL;
	}

	return(1);
}


DWORD WINAPI EroomSessionPollingProc(LPVOID Param)
{
	static  ULONG	w_OldTime=0;
	ULONG			w_NewTime;
	ULONG			w_TimeGap;
	char			w_IpBuff[100];
	CEroomNetSession	*wp_ESession = (CEroomNetSession *)Param;
	
	while(wp_ESession->m_PollFlag) {
		w_NewTime = GetTickCount();

		w_TimeGap = w_NewTime - w_OldTime;
		if(w_TimeGap < 0 || w_TimeGap > (ULONG)wp_ESession->m_PollTime) {

			EROOMIPLIST *wp_IpList;
			time_t		w_Time;

			time(&w_Time);

			wp_ESession->StartCSection();
			wp_IpList = wp_ESession->Head();
			while(wp_IpList) {
				if(wp_IpList->m_Count > 3 && (wp_IpList->m_Status&EI_ST_CONNECTED)) {
						// COUNT 啊 3锅捞 逞澜 
					wp_IpList->m_Status &= ~EI_ST_CONNECTED;
					wp_IpList->m_Status &= ~EI_ST_DISCONNECTED;
					wp_IpList->m_Status |= EI_ST_TIMEOUT;
					wp_IpList->m_Count = 0;
					wp_ESession->m_TimeOutFlag = 1;
				}
				if((wp_IpList->m_Status&EI_ST_CONNECTED) || 
					((wp_IpList->m_Status&EI_ST_DISCONNECTED) && (wp_IpList->m_Status&EI_ST_RECONNECT))) {	
	
					wp_IpList->m_Time = w_Time;
					wp_IpList->m_Count++;
					sprintf(w_IpBuff, "%d.%d.%d.%d", 
						((char *)wp_IpList->m_Ip)[0]&0x0ff, 
						((char *)wp_IpList->m_Ip)[1]&0x0ff, 
						((char *)wp_IpList->m_Ip)[2]&0x0ff, 
						((char *)wp_IpList->m_Ip)[3]&0x0ff);

					wp_ESession->Send(w_IpBuff, wp_IpList->m_Port, ES_CMD_POLL, 0);
				}
				wp_IpList = wp_IpList->mp_Next;
			}
			wp_ESession->EndCSection();

			w_OldTime = w_NewTime;
		} else {
			Sleep(100);
		}
	}
	SetEvent(wp_ESession->m_PEvent);
	wp_ESession->m_PollFlag = 0;
	return(1);
}

⌨️ 快捷键说明

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