//
//链路检测的指令是5个字节,如果第5个字节是小写的a ,那么就表示是链路检测,则发生 a过去。
//2008.08.04 如果数据长度是4,就是心跳数据包,那么就停止转发,表示心跳,心跳不转发的。
/*无线转换程序。程序设计容量为 65535个终端。终端分为两种类型,GPRS DTU终端、
*其它终端,组终端。编号为
*0x0000 ~ 0x7FFF的为GPRS 终端号。
*0x8000 ~ 0xFEFF为工作站号
*0xFF00 ~ 0xFFFF为组号
*/
#include "stdafx.h"
#include "hugearr.h"
#include "s.h"
#include "miscfun.h"
#include "protocol.h"
#include "HUB.h"
#include "HUBDLG.h"
#include "WorkSkt.h"
#include "ServerSkt.h"
#define DEADTIME 3600 // 1 小时没有反应,则表示不在线了
HUGE_ARR gHugeArr[0xFFFF];
TCP_HUGE_ARR gTcpHugeArr[0xFFFF];
TCP_TEMP_ARR gTempArr[0xFF]; //用于存储新创建的socket的。在收到数据后,就转入到大的数组了。
PRTL_HEAD* ph;
s* m_pLogSkt;
char gStart;
extern CHUBDlg* pDlg;
int UpdateList(CListCtrl* pListCtrl,unsigned short sId, unsigned short tId,unsigned char* ip,unsigned char* port,short T);
char buff2K[5120];
void stop(void)
{
gStart=0;
m_pLogSkt->Close();
delete m_pLogSkt;
}
void LogSnd( char* data, int length)
{
char buf[4000];
int len;
buf[0]=0x01;//版本
buf[1]=pDlg->m_nPort >>8;
buf[2]=pDlg->m_nPort &0xff;
buf[3]=(length>>8)&0xff;
buf[4]=length&0xff;
memcpy(buf+5,data,length);
len=m_pLogSkt->SendTo(buf,length+5,33333,"114.255.162.23",0);
}
void start(unsigned char* ip, unsigned short port)
{
/*int i;
unsigned int iRtn;
char ipbuf[20];
char strIp[20];
gStart=1;
memcpy(ipbuf,ip,20);
pS = new s;
IpToStr(strIp,ip);
iRtn = pS->Create(port,SOCK_DGRAM ,FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,strIp);
if(iRtn ==0)
{
dbg("创建socket 失败\r\n");
char buff[20];
sprintf(buff,"GPRS转发服务-创建socket 失败",pDlg->m_nPort);
pDlg->SetWindowText(buff);
}else
{
dbg("创建socket 成功\r\n");
char buff[20];
sprintf(buff,"GPRS转发服务-%4d",pDlg->m_nPort);
pDlg->SetWindowText(buff);
}
for(i=0;i<0xFFFF;i++)
gHugeArr[i].seconds=0xFFFF;
// 定义第 0 个地址为中心的 IP
gHugeArr[0].seconds=0; //中心一启动就是活动的
gHugeArr[0].ip[0]=ip[0];
gHugeArr[0].ip[1]=ip[1];
gHugeArr[0].ip[2]=ip[2];
gHugeArr[0].ip[3]=ip[3];
gHugeArr[0].port[0] = port&0x00FF; //因为网络字节流的关系,要反一下
gHugeArr[0].port[1] = (port&0xFF00) >> 8; //对中心的控制。中心要在列表显示,
UpdateList(&(pDlg->m_listId), 0,0, gHugeArr[0].ip,gHugeArr[0].port,0);
*/
}
void BldPingAck(char* inData, int inLen, char* outData, int *outLen)
{
PRTL_HEAD* pIn;
PRTL_HEAD* pOut;
*outLen = inLen;
memcpy(outData,inData,inLen);
pOut= (PRTL_HEAD*)outData;
pIn = (PRTL_HEAD*)inData;
pOut->sNumber[0] =pIn->tNumber[0];
pOut->sNumber[1] =pIn->tNumber[1];
pOut->tNumber[0] =pIn->sNumber[0];
pOut->tNumber[1] =pIn->sNumber[1];
pOut->ptlType = (unsigned char)PTL_PING_ACK;
}
int UpdateList(CListCtrl* pListCtrl,unsigned short sId, unsigned short tId,unsigned char* ip,unsigned char* port,short T)
{
int i,j;
unsigned short nPort;
CString strSid,strTid,strIp,strPort,strT;
strSid.Format("%d",sId);
strTid.Format("%d",tId);
strIp.Format("%d.%d.%d.%d",ip[0],ip[1],ip[2],ip[3]);
nPort= port[0]+port[1]*256;
strPort.Format("%d",nPort);
strT.Format("%d",T);
j=pListCtrl->GetItemCount();
for(i=0;i<j;i++)
{
if(pListCtrl->GetItemText (i,0)==strSid)
{
pListCtrl->SetItemText(i,1,strTid);
pListCtrl->SetItemText(i,2,strIp);
pListCtrl->SetItemText(i,3,strPort);
pListCtrl->SetItemText(i,4,strT);
break;
}
}
if(i==j) //只有没有找到才相等。
{
pListCtrl->InsertItem (0,strSid);
pListCtrl->SetItemText(0,1,strTid);
pListCtrl->SetItemText(0,2,strIp);
pListCtrl->SetItemText(0,3,strPort);
pListCtrl->SetItemText(0,4,strT);
}
return i; //返回插入到了第几行
}
//删除列表的一行
void DeleteList(CListCtrl* pListCtrl,unsigned short sId)
{
int i,j;
CString strSid;
strSid.Format("%d",sId);
j=pListCtrl->GetItemCount();
if (sId == 0)
return;
for(i=0;i<j;i++)
{
if(pListCtrl->GetItemText (i,0)==strSid)
{
pListCtrl->DeleteItem(i);
break;
}
}
}
//仅仅更新时间
void UpdateListT(CListCtrl* pListCtrl,unsigned short sId, unsigned short T)
{
int i,j;
CString strSid,strT;
strSid.Format("%d",sId);
strT.Format("%d",T);
j=pListCtrl->GetItemCount();
if (sId == 0)
return;
for(i=0;i<j;i++)
{
if(pListCtrl->GetItemText (i,0)==strSid)
{
pListCtrl->SetItemText(i,4,strT);
break;
}
}
if(i==j) //只有没有找到才相等。
{
pListCtrl->InsertItem (0,strSid);
pListCtrl->SetItemText(0,1,"Err");
pListCtrl->SetItemText(0,2,"Err");
pListCtrl->SetItemText(0,3,"Err");
pListCtrl->SetItemText(0,4,strT);
}
}
void start(void)
{
gStart = true;
unsigned int iRtn;
// char ipbuf[20];
// char strIp[20];
// gStart=1;
// memcpy(ipbuf,ip,20);
m_pLogSkt = new s;
//IpToStr(strIp,ip);
iRtn = m_pLogSkt->Create(4567,SOCK_DGRAM ,FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,"127.0.0.1");
if(iRtn ==0)
{
dbg("创建Logsocket 失败\r\n");
}else
{
dbg("创建Logsocket OK\r\n");
}
}
void initHugeArr(void)
{
int i;
for(i=0;i<0xFF;i++)
{
gTempArr[i].used = false;
gTempArr[i].closed = false;
}
for(i=0;i<0xFFFF;i++)
{
gTcpHugeArr[i].used = false;
gTcpHugeArr[i].closed = false;
gTcpHugeArr[i].seconds = 0xFFFF;
gTcpHugeArr[i].pWorkSkt = NULL;
}
}
char bldData[5120];
int tcp_Accept(void* p,unsigned char* ip,unsigned char* port) //返回值1 表示接收了,返回值0 表示拒绝。如果拒绝,那么即刻关闭连接
{
int i,j;
for(i=0;i<0xFF;i++)
{
if(gTempArr[i].used == false) //找到后退出循环。共存储255个
{
gTempArr[i].pWorkSkt = p;
gTempArr[i].used = true;
gTempArr[i].seconds = 0;
j=UpdateList(&(pDlg->m_list2),(int)p,0,ip,port,0);
// gTempArr[i].num =(int)p; //存储第几行。
gTempArr[i].closed = false;
break;
}
}
if (i<0xFF)
return 1;
else
{
return 0;
dbg("临时缓冲满了");
}
}
int tcp_X(void* p, unsigned char* ip,unsigned char* port, char* data, int length)
{
unsigned short iS;
unsigned short iT;
// unsigned char tIp[4];
// unsigned char tPort[2];
int i;
CWorkSkt* p1;
LogSnd(data,length);
ph=(PRTL_HEAD*)data;
iS=ph->sNumber[0]*256 + ph->sNumber[1];
iT=ph->tNumber[0]*256 + ph->tNumber[1];
if(gTcpHugeArr[iS].used == false) //没用到
{
gTcpHugeArr[iS].seconds =0; //只是记录一下秒数,不影响转发
gTcpHugeArr[iS].pWorkSkt=p;
gTcpHugeArr[iS].used = true;
gTcpHugeArr[iS].closed = false;
// 第一次,需删除临时表的项目
for(i=0;i<0xff;i++)
{
if((gTempArr[i].used==true)&&( (unsigned int)(gTempArr[i].pWorkSkt)==(unsigned int)p))
{
DeleteList(&(pDlg->m_list2),(unsigned int)(gTempArr[i].pWorkSkt));
gTempArr[i].used = false;
}
}
}else //已经用了,则有可能是以前的旧的,也有可能是正在使用的。如果socket句柄相同,那么就表示是正在使用的
{
if(gTcpHugeArr[iS].pWorkSkt == (CWorkSkt*)p) //正在用的,有效的
gTcpHugeArr[iS].seconds =0;
else
{
p1=(CWorkSkt*)(gTcpHugeArr[iS].pWorkSkt);
try
{
p1->Close();
delete p1;
}catch (...)
{
;
}
gTcpHugeArr[iS].seconds =0; //只是记录一下秒数,不影响转发
gTcpHugeArr[iS].pWorkSkt=p;
gTcpHugeArr[iS].used = true;
for(i=0;i<0xff;i++) //在这里需要把临时列表的清空
{
if((gTempArr[i].used==true)&&( (int)(gTempArr[i].pWorkSkt)==(int)p))
{
DeleteList(&(pDlg->m_list2),(unsigned int)(gTempArr[i].pWorkSkt));
gTempArr[i].used = false;
}
}
}
}
UpdateList(&(pDlg->m_listId),iS,iT,ip,port,0); //在收到信息后更新列表
if((iS==0) && (iT==0))
return 1; //中心不允许自己发给自己,否则就循环了。
if(iT==0) return 1;//防止进入死循环。这种情况也会进入死循环的。
if(4==length) //return 1;//如果长度是4, 退出,不转发数据。
{//修改成为应答心跳的模式,应答一个字符
GPRS DTU 数据转发平台
3星 · 超过75%的资源 需积分: 23 64 浏览量
2013-11-15
11:39:37
上传
评论 3
收藏 259KB RAR 举报
javasms_qq3134927020
- 粉丝: 2
- 资源: 8
最新资源
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
- 软件漏洞生命周期管理策略.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈