📄 eroomnet.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 + -