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