#include "map.h" #include "skt.h" #include "log.h" #include "manage.h" #pragma comment(lib, "skt.lib") #pragma comment(lib,"sysapi.lib") #pragma comment(lib, "log.lib") CMapping::CMapping() { _brun = false; _len = 0; _skt = INVALID_SKT; _status = Map_NoInit; _hThread = INVALID_HANDLE; memset(_msg, 0, MAX_BUF_LEN); memset(_client, 0, MAX_NAME_LEN); _hSection = sys_InitializeCriticalSection(); _hSecSend = sys_InitializeCriticalSection(); } CMapping::~CMapping() { Deinit(); sys_DeleteCriticalSection(_hSection); sys_DeleteCriticalSection(_hSecSend); } int CMapping::Init(const char* pszserver/* = 0*/) {//初始化服务端,传入NULL则绑定任意IP,自动绑定端口8687 RETURN_CHK_NOPRT(Map_NoInit == _status, 0); _skt = skt_server(pszserver ? pszserver : ANY_IP, 6050); if (INVALID_SKT == _skt) {//创建失败 return -1; } ins->m_skt = _skt; _status = Map_Disconnect; //未连接 StartRun(); //启动任务 return 0; } int CMapping::Deinit() {//关闭连接,反初始化 RETURN_CHK_NOPRT(Map_NoInit != _status, 0); StopRun(); //停止运行 Clear(); //清空缓冲区 sys_EnterCriticalSection(_hSection); Close(); //关闭连接 _status = Map_NoInit; sys_LeaveCriticalSection(_hSection); return 0; } int CMapping::Clear() {//清空当前缓冲区+发送区 sys_EnterCriticalSection(_hSection); Release(_vecSet); sys_LeaveCriticalSection(_hSection); sys_EnterCriticalSection(_hSecSend); Release(_vecSend); sys_LeaveCriticalSection(_hSecSend); return 0; } int CMapping::ReplaceSending() {//将缓冲区替换发送区 vector::iterator it; sys_EnterCriticalSection(_hSection); sys_EnterCriticalSection(_hSecSend); Release(_vecSend); for(it = _vecSet.begin(); it != _vecSet.end(); it++) { _vecSend.push_back(*it); } _vecSet.clear(); sys_LeaveCriticalSection(_hSection); sys_LeaveCriticalSection(_hSecSend); return 0; } int CMapping::SetData(int row, int col, const char* pszdata) {//设置要发送数据 -- 根据行列替换或增加 TMappingData d; vector::iterator it; RETURN_CHK_NOPRT(pszdata, ERR_INPUT_PARAM); d.len = (int)strlen(pszdata) + 1; sys_EnterCriticalSection(_hSection); for(it = _vecSet.begin(); it != _vecSet.end(); it++) { if (col == (*it).col && row == (*it).row) {//find if ((*it).len < d.len) {//缓冲区不够 (*it).len = d.len; delete (*it).pszdata; (*it).pszdata = new char[d.len]; } strcpy((*it).pszdata, pszdata); sys_LeaveCriticalSection(_hSection); return 0; } } //new d.col = col; d.row = row; d.pszdata = new char[d.len]; strcpy(d.pszdata, pszdata); _vecSet.push_back(d); sys_LeaveCriticalSection(_hSection); return 0; } void CMapping::StartRun() {//任务开始 ZERO_CHK(!_brun); _brun = true; _hThread = sys_CreateThread(ThreadFun, this); } void CMapping::StopRun() {//关闭任务 ZERO_CHK(_brun); _brun = false; sys_WaitForSingleObject(_hThread); sys_CloseHandle(_hThread); } void CMapping::Close() {//关闭连接 ZERO_CHK(INVALID_SKT != _skt); skt_close(_skt); _skt = INVALID_SKT; } void CMapping::Release(vector& vec) {//外部加锁 vector::iterator it; for(it = vec.begin(); it != vec.end(); it++) { FREE_ANY((*it).pszdata); } vec.clear(); } int WINAPI CMapping::ThreadFun(void* param) { CMapping* p = (CMapping*)param; return p->Process(); } int CMapping::Process() { while(_brun) {//循环 ChkStatus(); RecvMsg(); } return 0; } void CMapping::ChkStatus() {//检查连接状态 int status = 0; ushort port = 0; char ip[MAX_IP_LEN] = {0}; //ZERO_CHK(INVALID_SKT != _skt); char strbuff[256] = {0}; if (_status == SOCKET_CONNECTED) { for (int a = 0;am_test_cnt;a++) { sprintf(strbuff,"Status#%s$",ins->m_tdata[a].ate); //SendMsg(strbuff); } } ZERO_CHK(Map_Disconnect == _status); //休眠 sys_Sleep(50); status = skt_status(_skt); ZERO_CHK(SOCKET_CONNECTED == status); skt_get_addr(_skt, ip, &port); sprintf(_client, "%s:%d", ip, port); LOG_INFO("%s Connected", _client); _status = Map_Connected; } int CMapping::FindEnd(const char* pszmsg) { int res = 0; while(*pszmsg) { if ('$' == *pszmsg) {//ok, end flag break; } res++; pszmsg++; } return res; } void CMapping::RecvMsg() {//接收消息 int len = 0; char* ptmp = NULL; char* pdest = NULL; ZERO_CHK(Map_Connected == _status); pdest = _msg; len = skt_recv(_skt, _msg + _len, MAX_BUF_LEN - 1 - _len, 100); if (ERR_NO_CONNECT == len) {//已经断开 _status = Map_Disconnect; LOG_INFO("%s Disconnected", _client); } ZERO_CHK(len > 0); //error LOG_INFO("%s recv: %s", _client, _msg + _len); _len += len; //消息长度 if (MAX_BUF_LEN - 1 == _len) {//最大长度,不管有没有结束符 LOG_INFO("%s recv: %s not end char", _client, _msg); _len = 0; //清零 return; } while(_len > 0) { len = FindEnd(pdest); //查找结束符 if (_len <= len) {//找到最后的空字符,不算结束符 if (pdest != _msg) {//指针不等,需要前移 mem_forward(pdest, _len + 1, (uint)(pdest - _msg)); } return; } //新消息 ParseMsg(pdest, len); _len -= len + 1; pdest += len + 1; } } void CMapping::SendMsg(const char* psz) { int len = (int)strlen(psz); int ret = skt_send(_skt, psz, len); if (ret <= 0) { LOG_ERR("%s send %s return %d", _client, psz, ret); } } void CMapping::GetAllSendData(char* &psz) {//获取所有数据,传入NULL指针,返回new字符串 int len = 0; vector::iterator it; psz = NULL; //fail. sys_EnterCriticalSection(_hSecSend); for(it = _vecSend.begin(); it != _vecSend.end(); it++) {//这里包含分隔符,col、row的长度 len += (*it).len + 16; } if (0 == len) { sys_LeaveCriticalSection(_hSecSend); return; } psz = new char [len]; memset(psz, 0, len); len = 0; for(it = _vecSend.begin(); it != _vecSend.end(); it++) { len += sprintf(psz + len, "%d,%d,%s;", (*it).row, (*it).col, (*it).pszdata); } sprintf(psz + len, "%s", "#"); sys_LeaveCriticalSection(_hSecSend); } void CMapping::GetSendData(int col, int row, char* &psz) {//获取单个数据,传入NULL指针,返回new字符串 vector::iterator it; psz = NULL; //fail. sys_EnterCriticalSection(_hSecSend); for(it = _vecSend.begin(); it != _vecSend.end(); it++) {//这里包含分隔符,col、row的长度 if ((*it).col == col && (*it).row == row) {//find psz = new char [(*it).len + 16]; sprintf(psz, "%d,%d,%s#", (*it).row, (*it).col, (*it).pszdata); sys_LeaveCriticalSection(_hSecSend); return; } } sys_LeaveCriticalSection(_hSecSend); } void CMapping::ParseMsg(const char* psz, int len) { int col = 0; int row = 0; char* ptmp = NULL; char* pnext = NULL; char* pszsend = NULL; char buff[MAX_BUF_LEN] = {0}; ZERO_CHK(len > 0); strncpy(buff, psz, len); //拷贝消息 if (strstr(buff,"Register") != NULL) {//status if(AnalysisRegister(buff) == 0) SendMsg("Register#1$"); else SendMsg("Register#0$"); return; } if (strstr(buff,"Status") != NULL) {//获取所有 if(AnslyStatus(buff) == 0) { //没有回复 } } if (strstr(buff,"StartTest") != NULL) {//StartTest#761001#1$ } // // SendMsg("-1#"); //fail. //LOG_INFO("%s send: -1#", _client); } int CMapping::AnslysisStart(char* buff) { return 0; } int CMapping::AnalysisRegister(char* buff) {//Register#761001#761002#761003#761004#761005#761006$ int stemp = 0; char* p = strtok(buff, "#"); while(p) { stemp++; if (stemp !=1) { strcpy(ins->m_tdata[stemp-2].ate,p); ins->m_tdata[stemp-2].benable = 1; } p = strtok(NULL, "#"); } if (stemp-1>TESTCNT){return 1;} ins->m_test_cnt = stemp-1; if(ins->m_test_cnt ==0){return 1;} return 0; } int CMapping::AnslyStatus(char*buff) {//Status#761001#1$ int stemp = 0; int stempnum = 0; char* p = strtok(buff, "#"); while(p) { stemp++; if (stemp ==2) { for (int a =0;am_test_cnt;a++) { if (strcmp(ins->m_tdata[a].ate,p) == 0) { stempnum = a; break; } } } if (stemp == 3){break;} p = strtok(NULL, "#"); } if (stempnum == 0){return 1;} if (strcmp(p,"0") == 0) { ins->m_tdata[stempnum].status = TestRunning; } if (strcmp(p,"1") == 0) { ins->m_tdata[stempnum].status = TestIdle; } return 0; }