弱弱的问句,很急!

白鸽 2011-09-29 11:05:35
有没有人玩过
华为的 MML 接口开发-宽带AAA 的。求救,自己用C#写了个程序发送命令就是不行。希望有的朋友帮助一下
...全文
295 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny906 2011-09-29
  • 打赏
  • 举报
回复
这个,得需要你仔细看懂它的接口说明
枪牌 2011-09-29
  • 打赏
  • 举报
回复
你能抓到正常通信的数据包么?
再加上你贴出来的代码,基本ok
风骑士之怒 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 loveyan52152112 的回复:]
不得行!
[/Quote]
调试不通过的demo,你把它转成C#,成功的概率很低!!! 他还提供了什么文档
frank_29 2011-09-29
  • 打赏
  • 举报
回复
帮顶了。
白鸽 2011-09-29
  • 打赏
  • 举报
回复
顶起 哦,都帮我看看啊
pirates_fish 2011-09-29
  • 打赏
  • 举报
回复
弱弱的问问 为什么又很急
白鸽 2011-09-29
  • 打赏
  • 举报
回复
不得行!
风骑士之怒 2011-09-29
  • 打赏
  • 举报
回复
这个是C语言的DEMO? 在VS运行这个C语言试试看行不行先
shihaojie1219 2011-09-29
  • 打赏
  • 举报
回复
帮顶 赚分
白鸽 2011-09-29
  • 打赏
  • 举报
回复
就是因为C不是全的,只提供这一点,其中用到的域可能还不知道什么意思。有点晕,所以干脆就自己写了!结果运行起来!返回结果就是不对!纠结所以问问有没有玩过的
枪牌 2011-09-29
  • 打赏
  • 举报
回复
挺好玩的,我也做过协议组包,不是很复杂
你尝试在相同参数下C语言版和C#版发包的区别来判断自己的程序是否正确
用wild packet等抓包工具。协议方面的开发必须用到抓包工具。

更快的方法,如果你的C代码是全的,编译成dll供C#调用更加方便
萧炎 2011-09-29
  • 打赏
  • 举报
回复
这个确实有点难度 没搞过 而且还不是c#的
白鸽 2011-09-29
  • 打赏
  • 举报
回复
给你们代码也不用考虑能不能连接服务器,华为的东东还是比较安全的
白鸽 2011-09-29
  • 打赏
  • 举报
回复
这个是C代码!我对C不是很懂,所以看着它的需求自己用C#写了个连接但是就是传不上去,请各位,闲着无聊帮我解析一下这个C也可以!也好看看我的C#和这个有多大的出入

步骤 1	连接到MML Server。
营帐系统建立MML客户端到MML Server服务端口的Socket连接。
代码如下所示(以下为C语言代码,仅供参考)。
//建立Socket连接的函数。

void connectMML(Int& m_sockfd, Int& m_ip, Int& m_port)
{
struct sockaddr_in m_server_addr;
Int m_result;
memset((char*)&m_server_addr,'\0',(int)sizeof(m_server_addr));
m_server_addr.sin_family = AF_INET;
m_server_addr.sin_addr.s_addr = m_ip;
m_server_addr.sin_port = htons( m_port );
m_sockfd = socket( AF_INET, SOCK_STREAM, 0 );
if (0 >= m_sockfd)
{
printf("socket creat failed\n");
exit(0);
}
//Socket的内部函数,建立客户端到服务器的连接
m_result = connect(m_sockfd, (struct sockaddr * ) & m_server_addr
, sizeof( m_server_addr ));
if (0 != m_result)
{
printf("connect server failed\n");
exit(0);
}
}
步骤 2 编码。
MML客户端通过编码过程将需要发送的内容封装成一个符合MML接口规范的消息。

MML客户端需要支持编码普通消息和心跳消息。
编码的参考代码如下所示。
//宏定义

#define MAX_LEN_VERSION 4
#define MAX_LEN_TERMINAL 8
#define MAX_LEN_SERVNAME 8
#define MAX_LEN_DLGCTRL 6
#define MAX_LEN_TXID 8
#define MAX_LEN_TXCTRL 6
#define MAX_LEN_TXRSVD 4
#define MAX_MSG_LEN 65536
#define MAX_HEAD_LEN 56
#define MSG_STARTTAG_LEN 4
#define MSG_INFOLEN_LEN 4
#define MSG_CHKSUM_LEN 4
#define MSG_COMM_LEN 12
#define MAX_HB_MSG_LEN 4
#define MAX_HB_CONTENT_LEN 4
#define MAX_HB_CHCKSUM 4
#define HB_MSG_LEN 16
#define MAX_LEN_DLGID 8
#define MAX_LEN_DLGRSVD 4
#define MSG_STARTTAG "\x1C\x1D\x1E\x1F"
#define MSG_VERSION "1.00"
#define MSG_TERMINAL "internal"
#define MSG_TXRSVD " "
#define MSG_DLGRSVD " "
#define HB_CONTENT "HBHB"
//Encode 函数
EnRet Encode(MsgInfo & sendMsg,char * sendBuff, int & sendLen, int send_type)
{
//此处省略异常处理过程
......
//如果是心跳消息,编码方式如下
if (TYPE_OF_HB_MSG == send_type)
{
int temp_len;
char * p_num, hb_checksum [MAX_HB_CHCKSUM];
temp_len = 0;
strncpy(sendBuff+ temp_len,MSG_STARTTAG, MSG_STARTTAG_LEN);
temp_len += MSG_STARTTAG_LEN;
p_num = Int2ToHex(HB_MSG_LEN);
strncpy(sendBuff + temp_len, p_num, MAX_HB_MSG_LEN);
temp_len += MAX_HB_MSG_LEN;
strncpy (sendBuff + temp_len, HB_CONTENT, MAX_HB_CONTENT_LEN);
temp_len = MSG_STARTTAG_LEN + MAX_HB_MSG_LEN;
GetChkSum(MAX_HB_MSG_LEN,sendBuff + temp_len,hb_checksum);
temp_len = HB_MSG_LEN - MAX_HB_CHCKSUM;
strncpy(sendBuff + temp_len, hb_checksum, MAX_HB_CHCKSUM);
printf("\ncode HB secceed!\n%s",sendBuff);
return Success;
}
//如果是普通消息,编码如下
Int msglen,cmdlen,len;
char *p,chksum[MSG_CHKSUM_LEN];
char *pTx[ ] = { "TXBEG" , "TXCON" , "TXCAN" , "TXEND" };
char *pDlg[ ] = { "DLGLGN" , "DLGBEG" , "DLGCON" , "DLGEND" };
//打印发送的消息
PrintMsg(sendMsg);
//计算消息长度
cmdlen=strlen(sendMsg.cmd);
msglen=MAX_HEAD_LEN+cmdlen;
len=(4 - msglen % 4);
msglen+=len;
sendLen=msglen+MSG_COMM_LEN;
memset(sendBuff,' ',MAX_MSG_LEN);
len=0;
//拼装消息开始标志

strncpy(sendBuff+len, MSG_STARTTAG, MSG_STARTTAG_LEN);
len+=MSG_STARTTAG_LEN;
//拼装消息长度
p=Int2ToHex(msglen);
strncpy(sendBuff+len, p, MSG_INFOLEN_LEN);
len+=MSG_INFOLEN_LEN;
//拼装消息头

strncpy(sendBuff+len, MSG_VERSION, MAX_LEN_VERSION);
len+=MAX_LEN_VERSION;
strncpy(sendBuff+len, MSG_TERMINAL, MAX_LEN_TERMINAL);
len+=MAX_LEN_TERMINAL;
strncpy(sendBuff+len,sendMsg.service, strlen(sendMsg.service));
len+=MAX_LEN_SERVNAME;
//拼装会话头

p=Int4ToHex(sendMsg.snLogin);
strncpy(sendBuff+len, p, MAX_LEN_DLGID);
len+=MAX_LEN_DLGID;
strncpy(sendBuff+len,pDlg[sendMsg.dlgCtrl],strlen(pDlg[sendMsg.dlgCtrl]));
len+=MAX_LEN_DLGCTRL;
strncpy(sendBuff+len, MSG_DLGRSVD, MAX_LEN_DLGRSVD);
len+=MAX_LEN_DLGRSVD;
//拼装事务头

p=Int4ToHex(sendMsg.sequence);
strncpy(sendBuff+len, p, MAX_LEN_TXID);
len+=MAX_LEN_TXID;
strncpy(sendBuff+len,pTx[sendMsg.txCtrl],strlen(pTx[sendMsg
.txCtrl]));
len+=MAX_LEN_TXCTRL;
strncpy(sendBuff+len, MSG_TXRSVD, MAX_LEN_TXRSVD);
len+=MAX_LEN_TXRSVD;
//拼装操作信息
strncpy(sendBuff+len, sendMsg.cmd, cmdlen);
//拼装校验和

len=MSG_STARTTAG_LEN + MSG_INFOLEN_LEN;
GetChkSum(msglen,sendBuff+len,chksum);
len=sendLen-MSG_CHKSUM_LEN;
strncpy(sendBuff+len, chksum, MSG_CHKSUM_LEN);
return Success;
}

GetChkSum()函数的具体内容请参见“附录 A”。
步骤 3 解码。
客户端通过解码过程从MML Server接口返回的消息中获取具体内容。

客户端需要支持解码普通消息和心跳消息。
解码的参考代码如下所示。
//Decode 函数
EnRet Decode(MsgInfo &recMsg,char * recBuff,Int & recLen, int recv_type)
{
//此处省略异常处理过程
......
int msglen,len,tmpInt;
char chksum[MSG_CHKSUM_LEN],tmpStr[MAX_MSG_LEN];
char *pTx[ ] = { "TXBEG" , "TXCON" , "TXCAN" , "TXEND" };
char *pDlg[ ] = { "DLGLGN" , "DLGBEG" , "DLGCON" , "DLGEND" };
len=0;
//解码消息开始标志

strncpy(tmpStr, recBuff+len, MSG_STARTTAG_LEN);
tmpStr[MSG_STARTTAG_LEN]='\0';
len+=MSG_STARTTAG_LEN;
if(strncmp(tmpStr,MSG_STARTTAG,MSG_STARTTAG_LEN) != 0)
{
printf("Msg head error.");
return NotCMD;
}
//解码消息长度
strncpy(tmpStr, recBuff+len, MSG_INFOLEN_LEN);
tmpStr[MSG_INFOLEN_LEN]='\0';
len+=MSG_INFOLEN_LEN;
HexToInt2(tmpStr,tmpInt);
msglen=tmpInt;
if ( recv_type == TYPE_OF_CMD_MSG )
{
if(msglen+MSG_COMM_LEN != recLen)
{
printf("Msg length error.");
return Failure;
}
}
//如果是心跳消息,解码方式如下
if ( recv_type == TYPE_OF_HB_MSG )
{
tmpInt=HB_MSG_LEN;
char HBtempStr[HB_MSG_LEN],HBStr[HB_MSG_LEN];
strncpy(HBtempStr, recBuff, tmpInt);
HBtempStr[tmpInt]='\0';
StrTrim(HBtempStr);
strcpy(HBStr,"HBHB");
for (int i=0; i<4; i++)
{
if( recBuff[MSG_STARTTAG_LEN+MAX_HB_MSG_LEN+i]!=HBStr[i])
{
return Failure;
}
}
return Success;
}
//如果是普通消息,解码如下
//解码消息头

strncpy(tmpStr, recBuff+len, MAX_LEN_VERSION);
tmpStr[MAX_LEN_VERSION]='\0';
len+=MAX_LEN_VERSION;
StrTrim(tmpStr);
strncpy(tmpStr, recBuff+len, MAX_LEN_TERMINAL);
tmpStr[MAX_LEN_TERMINAL]='\0';
len+=MAX_LEN_TERMINAL;
StrTrim(tmpStr);
strncpy(tmpStr, recBuff+len, MAX_LEN_SERVNAME);
tmpStr[MAX_LEN_SERVNAME]='\0';
len+=MAX_LEN_SERVNAME;
StrTrim(tmpStr);
strcpy(recMsg.service,tmpStr);
//解码会话头

strncpy(tmpStr, recBuff+len, MAX_LEN_DLGID);
tmpStr[MAX_LEN_DLGID]='\0';
len+=MAX_LEN_DLGID;
HexToInt4(tmpStr,tmpInt);
recMsg.snLogin=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_DLGCTRL);
tmpStr[MAX_LEN_DLGCTRL]='\0';
len+=MAX_LEN_DLGCTRL;
StrTrim(tmpStr);
for(tmpInt=0;tmpInt<4;tmpInt++) if(strcmp(pDlg[tmpInt],tmpStr)==0) break;
recMsg.dlgCtrl=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_DLGRSVD);
tmpStr[MAX_LEN_DLGRSVD]='\0';
len+=MAX_LEN_DLGRSVD;
//解码事务头

strncpy(tmpStr, recBuff+len, MAX_LEN_TXID);
tmpStr[MAX_LEN_TXID]='\0';
len+=MAX_LEN_TXID;
HexToInt4(tmpStr,tmpInt);
recMsg.sequence=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_TXCTRL);
tmpStr[MAX_LEN_TXCTRL]='\0';
len+=MAX_LEN_TXCTRL;
StrTrim(tmpStr);
for(tmpInt=0;tmpInt<4;tmpInt++) if(strcmp(pTx[tmpInt],tmpStr)==0) break;
recMsg.txCtrl=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_TXRSVD);
tmpStr[MAX_LEN_TXRSVD]='\0';
len+=MAX_LEN_TXRSVD;
//解码操作信息
tmpInt=msglen-(MAX_HEAD_LEN);
strncpy(tmpStr, recBuff+len, tmpInt);
tmpStr[tmpInt]='\0';
len+=tmpInt;
StrTrim(tmpStr);
strcpy(recMsg.cmd, tmpStr);
//解码校验和

strncpy(tmpStr, recBuff+len, MSG_CHKSUM_LEN);
tmpStr[MSG_CHKSUM_LEN]='\0';
len=MSG_STARTTAG_LEN + MSG_INFOLEN_LEN;
GetChkSum(msglen,recBuff+len,chksum);
if(strncmp(tmpStr,chksum,MSG_CHKSUM_LEN) != 0)
{
printf("Msg chksum error.");
return Failure;
}
//解码完毕,打印消息

PrintMsg(recMsg);
return Success;
}
小笨熊 2011-09-29
  • 打赏
  • 举报
回复
华为一般都是保密的。。。
sdl2005lyx 2011-09-29
  • 打赏
  • 举报
回复
难道没Demo程序?
h_zai888 2011-09-29
  • 打赏
  • 举报
回复
谷歌 百度 qq 以后在来csdn
hanmuxue 2011-09-29
  • 打赏
  • 举报
回复
顶 上
zhs1931 2011-09-29
  • 打赏
  • 举报
回复
自力更生吧,你这个范围太细了,很难找到用过的。除非多给些信息帮你参考。
北拐 2011-09-29
  • 打赏
  • 举报
回复
我是来骗分的,没有
加载更多回复(13)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧