📄 sgipsock.cpp
字号:
p+=4;
*(ps+1)=*(int *)p;
p+=4;
*(ps+2)=*(int *)p;
}
#define SAVEDATAPATH "d:\\buffhis\\"
BOOL bCreateFile=TRUE;
HFILE hFile=-1;
void CSGIPSock::savebuffertofile(const char *buf)
{
BYTE byFileType=0; //须配置控制 0: 以时间间隔秒产生文件, 1:以文件尺寸xMB产生文件
static time_t prevtime=time(NULL);
int timeintervel=10*60; //??? 5秒,须配置控制,按时间产生文件的时间间隔
int err;
OFSTRUCT OfStruct;
DWORD IOStatus; /* result of a file read */
char filestr[100],cdrstr[1000],AAddrstr[40],BAddrstr[40],CAddrstr[40],cTemp[40],prevstr[10];
char bufferfile[2000];
memset(bufferfile,0,sizeof(bufferfile));
unsigned char BUFTELNO[20];
SYSTEMTIME syst;
time_t curttime=time(NULL);
GetLocalTime(&syst);
//bCreateFile
if((curttime-prevtime)>timeintervel)//if(syst.wHour==0&&bCreateFile)// //须产生新文件
{
bCreateFile=FALSE;
prevtime=curttime;
if(hFile!=-1) //原文件结束,新产生文件
{
SetFilePointer((HANDLE)hFile, 0, NULL, FILE_BEGIN);
sprintf(cdrstr,"wangliang savedata file begin\n");
WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
CloseHandle((HANDLE)hFile);
}
hFile=-1;
GetLocalTime(&syst);
sprintf(filestr,"%sBJ%04d%02d%02d%02d%02d.buf",SAVEDATAPATH,syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute);
if (hFile=OpenFile(filestr, (LPOFSTRUCT) &OfStruct, OF_EXIST|OF_SHARE_EXCLUSIVE) >= 0)
{
hFile=OpenFile(filestr,&OfStruct,OF_READWRITE|OF_CANCEL|OF_PROMPT);
if(hFile<0)
return;
}
else
{
hFile=OpenFile(filestr,&OfStruct,OF_CREATE | OF_READWRITE|OF_CANCEL|OF_PROMPT);
if(hFile<0)
return;
//新产生文件,形成文件目录内容
sprintf(cdrstr,"wangliang savedata file begin\n");
WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
}
}
else
{
// if(syst.wHour!=0) bCreateFile=TRUE;
if(hFile==-1) //新产生文件
{
GetLocalTime(&syst);
sprintf(filestr,"%sBJ%04d%02d%02d%02d%02d.buf",SAVEDATAPATH,syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute);
if (hFile=OpenFile(filestr, (LPOFSTRUCT) &OfStruct, OF_EXIST|OF_SHARE_EXCLUSIVE) >= 0)
{
hFile=OpenFile(filestr,&OfStruct,OF_READWRITE|OF_CANCEL|OF_PROMPT);
if(hFile<0)
return;
}
else
{
hFile=OpenFile(filestr,&OfStruct,OF_CREATE | OF_READWRITE|OF_CANCEL|OF_PROMPT);
if(hFile<0)
return;
//新产生文件,形成文件目录内容
sprintf(cdrstr,"wangliang savedata file begin\n");
WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
}
}
}
//hFile!=0,文件已经打开,可直接写文件内容
// sprintf(cdrstr,"%s",data);
////////////////////////////////////////////////////////
// int times=0;
// char *p;
// char perbyte[5];
// p=(char*)buf;
// while(1)
// {
// if(times==0)
// {
GetLocalTime(&syst);
sprintf(bufferfile,"%04d %02d %02d %02d %02d %02d \n",syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute,syst.wSecond);
// }
// sprintf(perbyte,"%x ",*p);
// p++;
// times++;
// if(times>1000) break;
// if((times%32)==0) strcat(bufferfile,"\n");
// }
////////////////////////////////////////////////////////
WriteFile((HANDLE)hFile, (LPSTR)bufferfile, strlen(bufferfile),&IOStatus,NULL);
WriteFile((HANDLE)hFile, (LPSTR)buf,1000,&IOStatus,NULL);
WriteFile((HANDLE)hFile, (LPSTR)"\n", strlen(bufferfile),&IOStatus,NULL);
}
int CSGIPSock::fLogin1(char *usrname, char *passwd)
{
strcpy(m_smscInfo.usrName,usrname);
strcpy(m_smscInfo.passWd,passwd);
SGIP_PRINTOUT("Logining.....");
BYTE buffer[MAX_SMPP_COM_BUF];
memset(buffer,0,MAX_SMPP_COM_BUF);
struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
BYTE *p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);
*p=1;///SP向SMG建立的连接,用于发送命令
p++;
p=(BYTE*)AddStrToBuf((char*)p,usrname,16);
p=(BYTE*)AddStrToBuf((char*)p,passwd,16);
p=(BYTE*)AddStrToBuf((char*)p,"",8);
phead->command_id=SGIP_BIND;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
// phead->sequence_no=m_sequence++;
int login_sequence[3];//=phead->sequence_no;
AddSequenceNO((char*)buffer,"382032",m_sequence++);
network_head(phead);
GetSequence(buffer,login_sequence);
// network_dword(login_sequence[0]);
//if(Send(buffer,packet_len)==SOCKET_ERROR)
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
{
if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
{
SGIP_PRINTOUT("FAILED:Login ,send packet failed.Disconnect...");
fDisconnect();
return -0xff;
}
}
// Sleep(500);
//receive resp
DWORD dRevLen;
UINT starttime=time(NULL);
//MSG msg;
while(1) //GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg); DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen); //get the socket on receive data length
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
{
memset(buffer,0,MAX_SMPP_COM_BUF);
dRevLen=fReceive(buffer,MAX_SGIP_RSP_BUF_LEN);
if(login_sequence[0]==phead->SP
/*&&login_sequence[1]==phead->itime*/
&&login_sequence[2]==phead->no
&& phead->command_id==SGIP_BIND_RESP)
{
BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
m_bAlive=TRUE; SGIP_PRINTOUT("Login +OK.");
return ty;
}
else
{
// SGIP_PRINTOUT("FAILED: Login +FAILED.");
// return -4;
continue;
}
}
Sleep(50);
if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
if(time(NULL)-starttime>MAX_SGIP_LOGINTIME) //5--10s
{
SGIP_PRINTOUT("FAILED:LOGIN receive timeout");
fDisconnect();
return -4;
}
}
return -4;
}
int CSGIPSock::fSendSM(char* destaddr,char* srcaddr, const char* sendmsg,bool bResp)
{
BYTE buffer[MAX_SMPP_COM_BUF];
struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
BYTE* p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);
memset(buffer,0,MAX_SMPP_COM_BUF);
p=(BYTE*)AddStrToBuf((char*)p,srcaddr,21);
p=(BYTE*)AddStrToBuf((char*)p,"000000000000000000000",21);//付费号码
//p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//付费号码
*p++=1;//接收的用户数
p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//接收的号码
p=(BYTE*)AddStrToBuf((char*)p,"82032",5);//企业代码
p=(BYTE*)AddStrToBuf((char*)p,"xylsm",10);//业务代码 wangliang 2003.2.10
*p++=1;//记费类型
p=(BYTE*)AddStrToBuf((char*)p,"0",6);//该条短消息的收费值
p=(BYTE*)AddStrToBuf((char*)p,"0",6);//赠送用户的话费
*p++=0;//代收费标志,0:应收;1:实收
*p++=2;//引起MT消息的原因 2-非MO点播引起的MT消息
*p++=0;//优先级0-9从低到高,默认为0
p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值
p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息定时发送的时间,如果为空,表示立刻发送该短消息
*p++=2;//状态报告标记 1-该条消息无论最后是否成功都要返回状态报告
//*p++=0;//信息类型 0-短消息信息
*p++=0;//GSM协议类型。 0 The TP-UD field contains only the short message
*p++=0;//GSM 2TP_udhi协议类型。 0 The TP-UD field contains only the short message
*p++=15;//8;//短消息的编码格式 8:UCS2编码 15:gbk 0:ASSIC
*p++=0;//信息类型:0-短消息信息
// *p++=len;//短消息的长度
// int len=fill_message(p+1,sendmsg); //length and content
// p+=len;
///////////////////
p+=3;
int len=strlen(sendmsg);
*(DWORD*)p=(DWORD)len;
p++;
p=(BYTE*)AddStrToBuf((char*)p,(char*)sendmsg,len);
///////////////////
p=(BYTE*)AddStrToBuf((char*)p,"",8);//保留,扩展用
phead->command_id=SGIP_SUBMIT;
UINT packet_len=p-buffer;
phead->command_length=packet_len;
AddSequenceNO((char*)buffer,"382032",m_sequence++);
TRACE("--------PACKET_LEN---%d\n",phead->command_length);
int send_sequence[3];
network_head(phead);
TRACE("--------PACKET_LEN---%d\n",phead->command_length);
GetSequence(buffer,send_sequence);
///////////////
// savebuffertofile((const char*)buffer);
//////////////
//if(Send(buffer,packet_len)==SOCKET_ERROR)
//修改对长TCP包一个send可能不能发送完
BYTE *pbuf=buffer;
len=0;
int ErrCode,SendNum=0;
BOOL bBeginSend=false;
while((len=send(m_hSocket,(const char*)pbuf,packet_len,0))!=packet_len)
{
if(len==SOCKET_ERROR)
{
ErrCode=WSAGetLastError();
if(ErrCode!= WSAEWOULDBLOCK)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect.....%d.",ErrCode);
// fDisconnect();
return -0xff;
}
else
{
if(bBeginSend)
{
SendNum++; //blocke err closeconnect
if(SendNum>500)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect....%d",ErrCode);
// fDisconnect();
return -0xff;
}
Sleep(30);
}
else
{
SendNum++; //block err closeconnect
if(SendNum>500)
{
TRACE("FAILED: Send Short Message ,send packet failed.disconnect...%d",ErrCode);
// fDisconnect();
return -0xff;
}
Sleep(30);
}
}
}
else
{
bBeginSend=TRUE;
if(len==packet_len)
break;
pbuf+= len;
packet_len-= len;
}
}
// Sleep(50);
bResp=false; //不等待结果
if(!bResp) return 0;
FD_SET sockset = {1, m_hSocket};
TIMEVAL tv = {10, 0};
int result=select(0, &sockset, NULL, NULL, &tv);
DWORD dRevLen;
// UINT starttime=time(NULL);
//MSG msg;
if(result>0)//while(1)// GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg);
//DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen);
if ( FD_ISSET( m_hSocket, &sockset))
{
#if 1
// while(1){
// dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
dRevLen=fReceive(buffer,MAX_SMPP_COM_BUF);
if(send_sequence[0]==phead->SP
&&send_sequence[1]==phead->itime
&&send_sequence[2]==phead->no
&&phead->command_id==SGIP_SUBMIT_RESP)
{
BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
return ty;
}
// if(dRevLen<=0)
// break;
// result=select(0, &sockset, NULL, NULL, &tv);
// if(result>0)
// {
// if ( FD_ISSET( m_hSocket, &sockset))
// continue;
// else
// break;
// }
// else
// break;
// }
#else
/* ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
{
memset(buffer,0,MAX_SMPP_COM_BUF);
dRevLen=fReceive(buffer,sizeof(MAX_SMPP_COM_BUF));
// if(send_sequence==phead->sequence_no && phead->command_id==ESME_SUB_SM_RESP)
if(send_sequence==phead->sequence_no &&phead->command_id==ESME_SUB_SM_RESP)
{
if(phead->command_status==E_SUCCESS)
{
SGIP_PRINTOUT((CString)destaddr + " Submit +OK.\n");
return 1;
}
else
{
SGIP_PRINTOUT("FAILED: Submit.\n");
fLogout(FALSE);
fDisconnect();
return -2;
}
}
}*/
//TranslateMessage(&msg); DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen); //get the socket on receive data length
//////////////////////////////
UINT starttime=time(NULL);
while(1) //GetMessage(&msg, NULL, 0, 0) )
{
//TranslateMessage(&msg); DispatchMessage(&msg);
//IOCtl(FIONREAD,&dRevLen); //get the socket on receive data length
ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
{
memset(buffer,0,MAX_SMPP_COM_BUF);
dRevLen=fReceive(buffer,MAX_SGIP_RSP_BUF_LEN);
if(send_sequence[0]==phead->SP
/*&&send_sequence[1]==phead->itime*/
&&send_sequence[2]==phead->no
&& phead->command_id==SGIP_SUBMIT_RESP)
{
BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
m_bAlive=TRUE; SGIP_PRINTOUT("SUBMIT_RESP +OK.");
return ty;
}
else
{
SGIP_PRINTOUT("FAILED: SUBMIT_RESP FAILED.");
// return -4;
}
}
Sleep(50);
if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
if(time(NULL)-starttime>MAX_SGIP_LOGINTIME) //5--10s
{
SGIP_PRINTOUT("FAILED:SUBMIT_RESP timeout");
break;
// fDisconnect();
// return -4;
}
}
/////////////////////////////////////
#endif
}
}
else if(result<0)
{
// Sleep(50);
// if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
// if(time(NULL)-starttime>MAX_SGIP_SUBTIME) //5--10s
{
SGIP_PRINTOUT("FAILED: SendSM receive timeout");
fLogout(FALSE);
fDisconnect();
// Sleep(3000);
// return -4;
}
}
FD_CLR(m_hSocket,&sockset);
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -