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

📄 eroomnet.cpp

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


CEroomNet::CEroomNet(int a_QueueFlag) : CWiseNet(a_QueueFlag)
{
	int			w_II;

	m_WaitTime = EN_WAITTIME * 1000;
	m_TryCnt   = EN_TRYCNT;
	m_Sequence = 1;			// 泅犁 Sequence Number (1 ~ MAX_QUEUENUM)
							// QUEUE俊 历厘捞 救瞪锭绰 刘啊啊 救凳 ==> 0 ==> (茄率狼 老规傈价 肚绰 览翠捞 鞘夸绝阑 版快)

	m_RecvQIndex = 0;

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

	m_CancelFlag = 0;
								
	memset(&m_SendQ, 0x00, sizeof(m_SendQ));
	memset(&m_RecvQ, 0x00, sizeof(m_RecvQ));

	for(w_II=0;w_II<MAX_RQUEUENUM;w_II++) {
		m_SendQ[w_II].mp_Data = new unsigned char[ERM_PACKETDATA_SIZE+ERM_PACKETDATA_SIZE];
		m_RecvQ[w_II].mp_Data = new unsigned char[ERM_PACKETDATA_SIZE+ERM_PACKETDATA_SIZE];
	}
}

CEroomNet::~CEroomNet()
{
	int	w_II;

	for(w_II=0;w_II<MAX_SQUEUENUM;w_II++) {
		delete m_SendQ[w_II].mp_Data;
		m_SendQ[w_II].mp_Data = NULL;
	}
	for(w_II=0;w_II<MAX_RQUEUENUM;w_II++) {
		delete m_RecvQ[w_II].mp_Data;
		m_RecvQ[w_II].mp_Data = NULL;
	}

}

// SEND傈 馆靛矫 ERMPACKET甫 檬扁拳秦辑 荤侩秦具 凳
int	CEroomNet::Send(char *ap_Ip, int a_Port, ERMPACKET *ap_Packet)
{
	MSG		w_Msg;
	int		w_Seq;
	ULONG	w_STime, w_ETime;
	int		w_TryCnt = 0;
	int		w_Ret = 1;

	m_CancelFlag = 0;					// NO CANCEL FLAG..

	if(!ap_Packet->m_Head.m_Code[0]) {
		ap_Packet->m_Head.m_Code[0] = m_Code[0];
		ap_Packet->m_Head.m_Code[1] = m_Code[1];
	}
	if(ap_Packet->m_Head.m_Check & EN_ANSWER_NEED) {		// 单捞鸥 府畔阑 夸备且版快 
															// 傈价犬牢篮 窍瘤 臼澜
		ap_Packet->m_Head.m_Check &= ~EN_CONFIRM_NEED;
	}
	
	srand((unsigned)time(NULL));
	ap_Packet->m_Head.m_CheckSum = rand();
	
	if((ap_Packet->m_Head.m_Check & EN_CONFIRM_NEED) ||
		(ap_Packet->m_Head.m_Check & EN_ANSWER_NEED) ) {	// 府畔/犬牢阑 夸备矫 ==> QUEUE俊 历厘

		w_Seq = m_Sequence-1;
		ap_Packet->m_Head.m_Sequence = m_Sequence++;

		if(m_Sequence > MAX_SQUEUENUM) {
			m_Sequence = 1;
		}

		m_SendQ[w_Seq].m_Flag = EN_INUSE_FLAG;		// 荤侩 敲贰弊 ON
		memcpy(&m_SendQ[w_Seq].m_Head, &ap_Packet->m_Head, ERM_PACKETHEAD_SIZE);
													// Header Copy
		m_SendQ[w_Seq].m_Port = a_Port;
		strcpy(m_SendQ[w_Seq].m_Ip, ap_Ip);

RE_SEND:
		w_STime = GetTickCount();
		w_TryCnt++;
		
		m_SendQ[w_Seq].m_RCheck = ap_Packet->m_Head.m_Check;		// RECV 咯何 CHECK  CLEAR
		m_SendQ[w_Seq].m_RQIndex = 0;				// 档馒 单捞鸥 困摹	CLEAR
	}

	w_Ret = CWiseNet::Send(ap_Ip, a_Port, (char *)ap_Packet, ERM_PACKETHEAD_SIZE + ap_Packet->m_Head.m_Len);
	if(w_Ret < 0) {
		return(w_Ret);
	}

	if((ap_Packet->m_Head.m_Check & EN_CONFIRM_NEED) ||
		(ap_Packet->m_Head.m_Check & EN_ANSWER_NEED) ) {	// ANSWER WAIT

		while ((m_SendQ[w_Seq].m_RCheck & EN_CONFIRM_NEED) || 
			(m_SendQ[w_Seq].m_RCheck & EN_ANSWER_NEED)) {	// RECV 咯何 眉农 
			if(m_CancelFlag) {
				w_Ret = (int)(-EN_ERR_CANCEL);
				return(w_Ret);				// SEND ERROR
			}

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

			w_ETime = GetTickCount();
			if((w_ETime - w_STime) > (ULONG)m_WaitTime) {

				if(w_TryCnt >= m_TryCnt) {
					w_Ret = (int)(-EN_ERR_SEND);
					return(w_Ret);				// SEND ERROR
				}

				goto RE_SEND;	
			}
			Sleep(1);
		}
		return(m_SendQ[w_Seq].m_RQIndex);		// RECV茄 单捞鸥 困摹 
	}
	return(w_Ret);
}

int CEroomNet::GetRecvData(ERMQUEUE *ap_Packet, int a_Index)
{
	if(a_Index >= 0 && a_Index < MAX_RQUEUENUM) {
		if(m_RecvQ[a_Index].m_Flag & EN_INUSE_FLAG) { 
			memcpy(ap_Packet, &m_RecvQ[a_Index], sizeof(ERMQUEUE));
		}
		return(1);
	}

	return(-1);
}

ERMQUEUE *CEroomNet::GetRecvData(int a_Index)
{
	if(a_Index >= 0 && a_Index < MAX_RQUEUENUM) {
		if(m_RecvQ[a_Index].m_Flag & EN_INUSE_FLAG) { 
			return(&m_RecvQ[a_Index]);
		}
	}
	return(NULL);
}

void CEroomNet::SendConfirm(char *ap_Ip, int a_Port, USHORT a_Seq, USHORT a_CheckSum)
{
	ERMPACKET	w_Packet;

	memset(&w_Packet, 0x00, ERM_PACKETHEAD_SIZE);

	w_Packet.m_Head.m_Code[0] = m_Code[0];
	w_Packet.m_Head.m_Code[1] = m_Code[1];
	w_Packet.m_Head.m_Check |= EN_CONFIRM;			// ?? 鞘夸 绝阑瘤档.
	w_Packet.m_Head.m_Check |= EN_PACKET_ONLY;		// 1俺 PACKET
	w_Packet.m_Head.m_Cmd = EN_CMD_NONE;
	w_Packet.m_Head.m_RSequence = a_Seq;
	w_Packet.m_Head.m_RCheckSum = a_CheckSum;

	CWiseNet::Send(ap_Ip, a_Port, (char *)&w_Packet, ERM_PACKETHEAD_SIZE);
	
}


int	CEroomNet::Recv(char *ap_Ip, int &ar_Port, char *ap_Buff, int &ar_Len)
{
	int				w_Rtn;
	ERMPACKET		*wp_RPacket;
	int				w_Seq;

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

	if(wp_RPacket->m_Head.m_Code[0] != m_Code[0] || wp_RPacket->m_Head.m_Code[1] != m_Code[1]) {
		return(0);
	}

	if(wp_RPacket->m_Head.m_Check & EN_CONFIRM_NEED) {		// 档馒 犬牢阑 夸备茄 版快 
		SendConfirm(ap_Ip, ar_Port, wp_RPacket->m_Head.m_Sequence, wp_RPacket->m_Head.m_CheckSum);
	}

	if(wp_RPacket->m_Head.m_Check & EN_CONFIRM) {			// 犬牢 单捞鸥牢版快 
		if(wp_RPacket->m_Head.m_RSequence <= MAX_SQUEUENUM && wp_RPacket->m_Head.m_RSequence > 0) {
			w_Seq = wp_RPacket->m_Head.m_RSequence-1;
			if((m_SendQ[w_Seq].m_RCheck & EN_CONFIRM_NEED) &&
				(wp_RPacket->m_Head.m_RCheckSum == m_SendQ[w_Seq].m_Head.m_CheckSum)) {
															// CHECK SUM犬牢 
				m_SendQ[w_Seq].m_RCheck &= ~EN_CONFIRM_NEED;
				m_SendQ[w_Seq].m_RCheck |= EN_CONFIRM;
			}
		}
		return(0);
	}
	if(wp_RPacket->m_Head.m_Check & EN_ANSWER) {			// 措翠单捞鸥牢 版快 
		if(wp_RPacket->m_Head.m_RSequence <= MAX_SQUEUENUM && wp_RPacket->m_Head.m_RSequence > 0) {
			w_Seq = wp_RPacket->m_Head.m_RSequence-1;
			if((m_SendQ[w_Seq].m_RCheck & EN_ANSWER_NEED) && 
				(wp_RPacket->m_Head.m_RCheckSum == m_SendQ[w_Seq].m_Head.m_CheckSum)) {

				if(wp_RPacket->m_Head.m_Check & EN_PACKET_FIRST) {	// 盖 霉 菩哦牢版快 
					m_SendQ[w_Seq].m_RQIndex = m_RecvQIndex;
				}
				memcpy(&m_RecvQ[m_RecvQIndex].m_Head, &wp_RPacket->m_Head, ERM_PACKETHEAD_SIZE);		// HEADER COPY
				memcpy(m_RecvQ[m_RecvQIndex].mp_Data, wp_RPacket->m_Data, wp_RPacket->m_Head.m_Len);	// DATA COPY
				m_RecvQ[m_RecvQIndex].m_Flag = EN_INUSE_FLAG;
				m_RecvQ[m_RecvQIndex].m_Port = ar_Port;
				strcpy(m_RecvQ[m_RecvQIndex].m_Ip, ap_Ip);

				if(wp_RPacket->m_Head.m_Check & EN_PACKET_LAST) { // 盖 盖 付瘤阜 菩哦牢版快 
					m_SendQ[w_Seq].m_RCheck &= ~EN_ANSWER_NEED;
					m_SendQ[w_Seq].m_RCheck |= EN_ANSWER;
				}
				m_RecvQIndex = (m_RecvQIndex + 1) % MAX_RQUEUENUM;		// QUEUE 锅龋 刘啊 
			}
		}
		return(0);
	}
	return(ar_Len);
}

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

int CEroomNet::SetRecvFunc(int (*ap_RecvFunc)(char *ap_Ip, int a_Port, char *ap_Buff, int w_Len), int a_WaitTime)
{
	DWORD		IDThread;
	HANDLE		hThread;

	if(!m_RecvFunc && ap_RecvFunc) {
		m_RecvFlag = 1;
		m_RecvFunc = ap_RecvFunc;
		m_WaitFlag = a_WaitTime;
		m_HEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
		hThread = ::CreateThread(NULL, 0, EroomNetRecvProc, 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) {
			WaitForSingleObject(m_HEvent, WN_KILLWAITTIME);
			CloseHandle(m_HEvent);
			m_HEvent = NULL;
		}
	}

	return(1);
}


extern "C" DWORD WINAPI EroomNetRecvProc(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;
	CEroomNet	*wp_EroomNet = (CEroomNet *)Param;

	while(wp_EroomNet->m_RecvFlag) {
		w_Rtn = wp_EroomNet->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_EroomNet->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");
		}
		Sleep(1);
	}
	SetEvent(wp_EroomNet->m_HEvent);
	wp_EroomNet->m_RecvFlag = 0;
	wp_EroomNet->m_RecvFunc = NULL;

	return(1);
}


⌨️ 快捷键说明

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