📄 emmgdlg_cpp.txt
字号:
{
dump_com_error(e);
return ;
}
AfxMessageBox("更新成功");
}
void CEMMGDlg::OnClickLISTuserright(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(m_userright.GetSelectedCount()==0)
return ;
POSITION iPos=m_userright.GetFirstSelectedItemPosition();
int nItem=0;
if(iPos==NULL)
return;
else
{
nItem=m_userright.GetNextSelectedItem(iPos);
}
m_icid=m_userright.GetItemText(nItem,0);
m_pky=m_userright.GetItemText(nItem,1);
// 类型
m_sk=m_userright.GetItemText(nItem,2);
m_esk=m_userright.GetItemText(nItem,3);
UpdateData(FALSE);
*pResult = 0;
}
void CEMMGDlg::OnBUTTONStart()
{
// initClient();
// initEMM();
int buflen;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
char buf[2048];//@@@@@@@@@@@@@@@@@@@@@@@@@
sockaddr_in localaddr;
UpdateData(TRUE);
unsigned short m_recvPort=m_EMMPort;
//section_TSpkt_flag=m_pktflag;
if(_access(LOGFILEPATH,0)==-1) //creat LOGFILEPATH
{
char sysstr[100];
sprintf(sysstr,"mkdir %s",LOGFILEPATH);
system(sysstr);
}
if ((sock1scs=socket(PF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
{
int iWinsockErr=WSAGetLastError();
temp.Format("Error %d come from the socket() funtion !! \r\n",iWinsockErr);
m_info.ReplaceSel(temp,EMM_LOG);
WriteToLogfile(temp,EMM_LOG);
return;
}
else
{
temp.Format("socket %d create succeed\r\n",sock1scs);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
}
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(m_recvPort);
localaddr.sin_addr.s_addr = inet_addr("192.168.9.200");
if (connect(sock1scs, (struct sockaddr *)&localaddr, sizeof(localaddr))==SOCKET_ERROR)
{
temp.Format("%d connect failed\r\n",sock1scs);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
return;
}
else
{
temp.Format("%d connect succeed\r\n",sock1scs);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
}
Make_Channel_Setup(buf,&buflen);
EMM_WriteTo(sock1scs,buf,buflen);
if(WSAAsyncSelect(sock1scs,m_hWnd,UM_EMM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
temp.Format("%d WSAAsyncSelect Failure id=%d\r\n",sock1scs,WSAGetLastError());
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
closesocket(sock1scs);
sock1scs=0;
}
(GetDlgItem(IDOK))->EnableWindow(FALSE);///////////////////////////
}
LONG CEMMGDlg::OnRecv(UINT wParam, LONG lParam)
{
int buflen,i;
char buf[2048];
// char *msgpkt;
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
Make_Channel_Setup(buf,&buflen);
EMM_WriteTo(wParam,buf,buflen);
if(WSAAsyncSelect(sock1scs,m_hWnd,UM_EMM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
temp.Format("%d WSAAsyncSelect Failure id=%d\r\n",sock1scs,WSAGetLastError());
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
closesocket(sock1scs);
sock1scs=0;
break;
}
case FD_WRITE:
WriteToLogfile("\r\n",EMM_LOG);
EMM_WriteTo(wParam,buf,buflen);
//ReadFrom(wParam,buf,MAX_MESSAGE_LENGTH);
break;
case FD_READ:
WriteToLogfile("\r\n",EMM_LOG);
ReadFrom(wParam,buf,MAX_MESSAGE_LENGTH);
{
int rc=recvMsgProcess(buf,buflen);
if(rc==1)
EMM_WriteTo(wParam,buf,buflen);
else if(rc==2)
{
DWORD dwEcmgThreadID;
HANDLE hEcmgServe=::CreateThread(NULL,0,tSendEmmData,(PVOID)&m_info,0,&dwEcmgThreadID);
if(hEcmgServe==NULL)
{
AfxMessageBox("fail to startup the emmg server !");
}
}
}
break;
case FD_CLOSE:
if(wParam==sock1scs) break;
temp.Format("%d socket closed\r\n",wParam);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
closesocket(wParam);
sock1scs=0;
}
return 1;
}
short CEMMGDlg::ReadFrom(SOCKET s,char *recvbuf, int buflen)
{
CString temp;
UINT recvlen=recv(s,recvbuf,buflen,0);
if(recvlen == SOCKET_ERROR)
{
int iWinsockErr=WSAGetLastError();
temp.Format("%d Error %d come from the recv()!!\r\n ",s,iWinsockErr);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
return -1;
}
else if (recvlen==0)
{
temp.Format("%d Recv():return FAILED,connection is shut down!\r\n",s);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
return -1;
}
else
{
temp.Format("%d Recv():return SUCCESS,packet length = %d\r\n",s,recvlen);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
WriteToLogfile(recvbuf,recvlen,EMM_LOG);
WriteToLogfile("\r\n",EMM_LOG);
return recvlen;
}
}
short CEMMGDlg::EMM_WriteTo(SOCKET s, char *sendbuf, int buflen)
{
CString temp;
int sendlen=send(s,sendbuf,buflen,0);
if (sendlen==SOCKET_ERROR)
{
int iWinsockErr=WSAGetLastError();
temp.Format("%d Error %d come from the send()!!\r\n ",s,iWinsockErr);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
return -1;
}
else
{
temp.Format("%d Send():return SUCCESS,packet length = %d\r\n",s,sendlen);
m_info.ReplaceSel(temp);
WriteToLogfile(temp,EMM_LOG);
WriteToLogfile(sendbuf,buflen,EMM_LOG);
WriteToLogfile("\r\n",EMM_LOG);
return(sendlen);
}
}
/*
void CEMMGDlg::OnMaxtextInfo()
{
// TODO: Add your control notification handler code here
// m_info.SetSel(0,-1);
}
*/
char CEMMGDlg::recvMsgProcess(char *msgpkt,int &buflen)
{
unsigned short message_type,message_length;
unsigned short parameter_type,parameter_length;
char parameter_value[200];
int pos=0;
unsigned int value;
protocol_version = msgpkt[0];
message_type = (msgpkt[1] << 8) | msgpkt[2];
message_length = (msgpkt[3] << 8) | msgpkt[4];
pos+=5;
temp.Format("protocol_version:%d message_type:0x%x message_length:%d\r\n",protocol_version,message_type,message_length);
m_info.ReplaceSel(temp);
if(protocol_version!=0x02) return 0;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
while(pos-5 < message_length)
{
parameter_type = (msgpkt[pos] << 8) | msgpkt[pos+1]; pos+=2;
parameter_length = (msgpkt[pos] << 8) | msgpkt[pos+1]; pos+=2;
memcpy(parameter_value,msgpkt+pos,parameter_length);
if(parameter_type!=0x7001)
stoi(parameter_value,value,parameter_length);
else parameter_value[parameter_length]='\0';
pos += parameter_length;
switch(parameter_type)
{
case 0x0001://client_id
if(message_type == 0x0013)//channel_status
Super_CAS_ID = value; //channel_setup message
temp.Format("EMMG/CLIENT_ID:0x%x \r\n ",value);
m_info.ReplaceSel(temp);
break;
case 0x0002://section_TSpkt_flag
temp.Format("section_TSpkt_flag:0x%x \r\n ",value);
m_info.ReplaceSel(temp);
break;
case 0x0003://EMM_channel_id
// if(message_type == 0x0013)//channel_status
temp.Format("EMM_channel_ID:0x%x \r\n",value);
m_info.ReplaceSel(temp);
break;
case 0x0004://EMM_stream_id
//if(message_type == 0x0113)//stream_status
temp.Format("EMM_stream_ID:0x%x \r\n",value);
m_info.ReplaceSel(temp);
break;
case 0x0005://datagram
break;
case 0x0006://bandwidth
temp.Format("patameter_type:0x%x parameter_length:0x%x Bandwidth:0x%x \r\n",parameter_type,parameter_length,value);
m_info.ReplaceSel(temp);
break;
case 0x0007://data_type
//if(message_type == 0x0113)//stream_status
temp.Format("data_type:0x%x \r\n ",value);
m_info.ReplaceSel(temp);
break;
case 0x0008://data_id
//if(message_type == 0x0113)//stream_status
temp.Format("data_ID:0x%x \r\n",value);
m_info.ReplaceSel(temp);
break;
case 0x0D://access_criteria
strcpy(access_criteria,parameter_value);
temp.Format("access_criteria:%s ",parameter_value);
m_info.ReplaceSel(temp);
break;
case 0x10://nominal_CP_duration
temp.Format("nominal_CP_duration:0x%x ",value);
m_info.ReplaceSel(temp);
break;
case 0x11://access_criteria_transfer_mode
temp.Format("access_criteria_transfer_mode:0x%x ",value);
m_info.ReplaceSel(temp);
break;
case 0x12://CP_number
temp.Format("CP_number:0x%x ",value);
m_info.ReplaceSel(temp);
break;
case 0x13://CP_duration
temp.Format("CP_duration:0x%x ",value);
m_info.ReplaceSel(temp);
break;
case 0x7000://Error_status
temp.Format("Error_status:0x%x \r\n ",value);
m_info.ReplaceSel(temp);
break;
case 0x7001://Error_information
temp.Format("error_information:%s \r\n",parameter_value);
m_info.ReplaceSel(temp);
break;
}
}
m_info.ReplaceSel("\r\n");
switch(message_type)
{
case 0x11://channel_setup
m_info.ReplaceSel("recv:channel_setup\r\n");
//Make_Channel_Status_Response(msgpkt,buflen); //生成channel_status消息
m_info.ReplaceSel("send:channel_status\r\n");
//Make_Stream_Setup(msgpkt,buflen); //生成stream_setup消息
//m_info.ReplaceSel("send:stream_setup\r\n");
return 1;
case 0x12://channel_test
m_info.ReplaceSel("recv:channel_test\r\n");
// Make_Channel_Status_Response(msgpkt,buflen); //生成channel_status消息
m_info.ReplaceSel("send:channel_status\r\n");
return 1;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
case 0x13://channel_status
m_info.ReplaceSel("recv:channel_status\r\n");
Make_Stream_Setup(msgpkt,buflen); //生成stream_setup消息
m_info.ReplaceSel("send:stream_setup\r\n");
return 1;
case 0x14://channel_close
m_info.ReplaceSel("recv:channel_close\r\n"); break;
case 0x15://channel_error
m_info.ReplaceSel("recv:channel_error\r\n"); break;
case 0x111://stream_setup
m_info.ReplaceSel("recv:stream_setup\r\n");
// Make_Stream_Status_Response(msgpkt,buflen); //生成stream_status消息
m_info.ReplaceSel("send:stream_status\r\n");
return 1;
case 0x112://stream_test
m_info.ReplaceSel("recv:stream_test\r\n");
// Make_Stream_Status_Response(msgpkt,buflen); //生成stream_status消息
m_info.ReplaceSel("send:stream_status\r\n");
return 1;
case 0x113://stream_status
m_info.ReplaceSel("recv:stream_status\r\n");
Make_BW_Request(msgpkt,buflen);
m_info.ReplaceSel("send:stream_BW_request\r\n");
return 1;
case 0x114://stream_close_request
m_info.ReplaceSel("recv:stream_close_request\r\n");
message_type=0x105; //生成Stream_close_response消息
msgpkt[1] = message_type >> 8;
msgpkt[2] = message_type & 0xff;
m_info.ReplaceSel("send:stream_close_response\r\n");
return 1;
case 0x115://stream_close_response
m_info.ReplaceSel("recv:stream_close_request\r\n");
message_type=0x105; //生成Stream_close_response消息
msgpkt[1] = message_type >> 8;
msgpkt[2] = message_type & 0xff;
m_info.ReplaceSel("send:stream_close_response\r\n");
return 1;
case 0x116://stream_error
m_info.ReplaceSel("recv:stream_error\r\n");
break;
case 0x117://stream_BW_request
m_info.ReplaceSel("recv:stream_error\r\n");
break;
case 0x118://stream_BW_allocation
m_info.ReplaceSel("recv:stream_BW_allocation\r\n");
Make_EMM_Provision(msgpkt,buflen);
m_info.ReplaceSel("send:EMM_data_provision\r\n");
//flag=1;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
return 2;
/*case 0x211://data_provision
m_info.ReplaceSel("recv:CW_porvision\r\n");
Make_ECM_Response(msgpkt,buflen); //生成ECM_response消息
m_info.ReplaceSel("send:ECM_response\r\n");
return 1;*/
}
return 0;
}
void CEMMGDlg::Make_Channel_Setup(char *buf,int *buflen)
{
buf[0]=0x02;//protocol_version
buf[1]=0x00; buf[2]=0x11;//channel_setup
buf[3]=0x00; buf[4]=0x13;//下面有19个字节
buf[5]=0x00; buf[6]=0x01;//client_id
buf[7]=0x00; buf[8]=0x04;
buf[9]=0x4A; buf[10]=0x02;
buf[11]=0x00; buf[12]=0x01;//
buf[13]=0x00; buf[14]=0x03;//data_channel_id
buf[15]=0x00; buf[16]=0x02;
buf[17]=0x00; buf[18]=0x01;
buf[19]=0x00; buf[20]=0x02;//section_TSpkt_flag
buf[21]=0x00; buf[22]=0x01;
buf[23]=0x00;
(*buflen)=24;
}
void CEMMGDlg::Make_Stream_Setup(char *buf,int &buflen)
{
buf[0]=0x02;//protocol_version
buf[1]=0x01; buf[2]=0x11;//stream_setup
buf[3]=0x00; buf[4]=0x1F;//下面有31个字节
buf[5]=0x00; buf[6]=0x01;//client_id
buf[7]=0x00; buf[8]=0x04;
buf[9]=0x4A; buf[10]=0x02;
buf[11]=0x00; buf[12]=0x01;
buf[13]=0x00; buf[14]=0x03;//EMM_channel_id
buf[15]=0x00; buf[16]=0x02;
buf[17]=0x00; buf[18]=0x01;
buf[19]=0x00; buf[20]=0x04;//EMM_stream_id
buf[21]=0x00; buf[22]=0x02;
buf[23]=0x00; buf[24]=0x01;
buf[25]=0x00; buf[26]=0x08;//data_id
buf[27]=0x00; buf[28]=0x02;
buf[29]=0x00; buf[30]=0x00;
buf[31]=0x00; buf[32]=0x07;//data_type
buf[33]=0x00; buf[34]=0x01;
buf[35]=0x00;//表示传送EMM
buflen=36;
}
void CEMMGDlg::Make_BW_Request(char *buf,int &buflen)
{
buf[0]=0x02;//protocol_version
buf[1]=0x01; buf[2]=0x17;//stream_BW_request
buf[3]=0x00; buf[4]=0x14;//下面有20个字节
buf[5]=0x00; buf[6]=0x01;//client_id
buf[7]=0x00; buf[8]=0x04;
buf[9]=0x4A; buf[10]=0x02;
buf[11]=0x00; buf[12]=0x01;
buf[13]=0x00; buf[14]=0x03;//EMM_channel_id
buf[15]=0x00; buf[16]=0x02;
buf[17]=0x00; buf[18]=0x01;
buf[19]=0x00; buf[20]=0x04;//EMM_stream_id
buf[21]=0x00; buf[22]=0x02;
buf[23]=0x00; buf[24]=0x01;
buflen=25;
}
void CEMMGDlg::OnButtonStop()
{
}
void CEMMGDlg::OnSelchangeComboSk()
{
// TODO: Add your control notification handler code here
UpdateData();
des3_context ctx3;
unsigned char buf[8+1]="\0";
// 用pky移字节构成三重密钥 来加密sk
memcpy(buf,(LPSTR)(LPCSTR)m_pky,8);
unsigned char DES3_keys[3][8];
memcpy(DES3_keys[0],buf,8);
memcpy(DES3_keys[1]+1,buf,7);
memcpy(DES3_keys[1],buf+7,1);
memcpy(DES3_keys[2]+2,buf,6);
memcpy(DES3_keys[2],buf+6,2);
des3_set_3keys( &ctx3, DES3_keys[0], DES3_keys[1],DES3_keys[2] );
memcpy(buf,(LPSTR)(LPCSTR)m_sk,8);
des3_encrypt( &ctx3, buf, buf );
//des3_decrypt( &ctx3, buf, buf );
m_esk.Format("%s",buf);
UpdateData(FALSE);
}
void CEMMGDlg::SendEMMData(void)
{
EMM_WriteTo(sock1scs,EmmData,EmmDataLen);
Make_EMM_Provision( EmmData,EmmDataLen);
}
void CEMMGDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
ShowWindow(SW_HIDE);
// CDialog::OnClose();
}
void CEMMGDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static int c=0;
CString str;
str.Format("c=%d\r\n",c++);
m_info.ReplaceSel(str);
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -