急急急!非常郁闷,给GPRS终端发送数据(UDP模式),终端接收不到数据
思路如下:
1,GPRS终端每隔30秒发送一次心跳数据保持GPRS连接
2,每次发送心跳数据,服务器都存贮一次此时的GPRS的IP地址和端口号
3,当服务器想要主动发送数据到GPRS终端的时候,读取对应存储的IP地址和端口号
4,服务器发送数据
相关程序如下:
1,服务器接收存储GPRS终端发送来的数据并存储IP地址与端口号
void CUDPServer::OnReceive(long length)
{
char *pbuf;
CString strSql,strimsi;
int addr_len,iRecLen,nLen;
struct sockaddr_in addr;
pbuf = new char[length+1];
memset(pbuf,0,length+1);
addr_len = sizeof(addr);
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
nLen=sizeof(pbuf);
if(iRecLen==SOCKET_ERROR||iRecLen<=0||iRecLen!=length)
{
printf("Receive Failed!");
}
else//存储数据及ip地址端口号
{
。。。。//此处省略从终端发送来的报文里获取 终端号码等内容
strSql.Format("insert into IpTable (Imsi,ip,port) values ('%s','%s','%d') ",strimsi,inet_ntoa(addr.sin_addr),htons(addr.sin_port));
pConn->Execute(strSql,NULL,adCmdText);//执行SQL语句
}
}
void CUDPServer::OnSend(long length)//读取数据库里存储的ip及端口信息,向终端发送数据(IpTable存储终端地址和端口信息,IFRe表存储发送服务器请求)
{
strSql.Format("SELECT top 10 IpTable.imsi,IpTable.ip,IpTable.port,IFRe.ID,\
IFRe.RequestType from IFRe inner join IpTable on IFRe.imsi= IpTable.imsi\
where IFRe.isquery=0 ");
pCmd->CommandText=(_bstr_t)strSql;
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->rsEOF)
{
_variant_t varImsi = pRst->GetCollect("imsi");//读取imei号码
_variant_t varRequest = pRst->GetCollect("RequestType");//读取请求
_variant_t varIp = pRst->GetCollect("ip");//读取ip地址
_variant_t varPort = pRst->GetCollect("port");//读取端口号
strImei = (char*)_bstr_t(varImsi);
strRequest = (char*)_bstr_t(varRequest);
strMessage.Format("%s",strRequest);//准备向终端发送的数据
char* SendBuf = strMessage.GetBuffer(strMessage.GetLength());
strIp = (char*)_bstr_t(varIp);
strPort = (char*)_bstr_t(varPort);
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(atol(strPort));
addrTo.sin_addr.S_un.S_addr=inet_addr(strIp);
//发送
sendto(m_SckSend,SendBuf,sizeof(SendBuf),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
pRst->MoveNext();
}
}
非常郁闷的是,给GPRS终端发送数据(UDP模式),终端接收不到数据,请有经验的朋友帮忙看一下,谢谢!!!
小弟Email:leonwb@163.com,如果那位朋友有现成的程序给小弟发送一份也不胜感激!!!