当前位置:  技术问答>linux和unix

代码比较长, 但是编译连接都通过了,就是结果不对。 希望各位帮帮忙, 时间紧急啊。老师要完成的作业

    来源: 互联网  发布时间:2016-06-24

    本文导语:  #include  #include  #include  struct STRU_HEAD {         int length;         unsigned char version;         unsigned char type;         unsigned char encrypt;         unsigned char reserved;          }; //封装包头和消息体 int ...

#include 
#include 
#include 

struct STRU_HEAD
{
        int length;
        unsigned char version;
        unsigned char type;
        unsigned char encrypt;
        unsigned char reserved;
        
};

//封装包头和消息体
int make_request_msg(char* p_command,unsigned char command_type,char* buffer)
{
    //封装包头
        char* tmp = p_command;
        struct STRU_HEAD head;
        head.length = 8+sizeof(buffer);
        head.version = 2;
        head.type = command_type;
        head.encrypt = 0x01;
        head.reserved = 0x00;

        memcpy(p_command,&head.length,sizeof(head.length));
        p_command += sizeof(head.length);
        memcpy(p_command,&head.version,sizeof(head.version));
        p_command += sizeof(head.version);
        memcpy(p_command,&head.type,sizeof(head.type));
        p_command += sizeof(head.type);
        memcpy(p_command,&head.encrypt,sizeof(head.encrypt));
        p_command += sizeof(head.encrypt);
        memcpy(p_command,&head.reserved,sizeof(head.reserved));
        p_command += sizeof(head.reserved);

//封装消息体
        memcpy(p_command,buffer,strlen(buffer));
        p_command += strlen(buffer);
        printf("The make_request_msg p_command is : %sn", p_command);
        return (int)(p_command-tmp);

}

// 解析上面make_request_msg()函数所封装的消息包 到res_info 和 msg_id 两部分当中去
int deal_response(char* buffer,char* res_info, unsigned int *msg_id)
{
        char* tmp;
char tmp_msg_id[10]={0};
        printf("The deal_response buffer = [%s]n",buffer);
        tmp =NULL;
        
        if(0 != buffer[0])
        {
                tmp = strchr(buffer,'-');
                if(tmp != NULL)
                {
                        strncpy(tmp_msg_id,buffer,(tmp-buffer));
                        *msg_id = atoi(tmp_msg_id);
                        strcpy(res_info,tmp+1);
                }
                return 0;
        }
  printf("The deal_response msg_id is : %dn", *msg_id);
  printf("The deal_response res_info is : %sn", res_info);
        return 1;
}


int main(void)
{
    char p_command[50] = {0};
char res_info[68] = {0};
unsigned int msg_id = 0;
char *buffer = "250-filename";
unsigned char command_type = 3;
int length ;

length = make_request_msg(p_command, command_type,buffer);
printf("The main p_command is %sn", p_command);
printf("The main message length is %dn", length);

deal_response(p_command,res_info,&msg_id);
printf("The main ret_info is %sn", res_info);
printf("The main msg_id is %ldn", msg_id);

 return 0;
}

我希望的结果是:
(1)通过make_request_msg()函数 把char *buffer = "250-filename"和 
    unsigned char command_type = 3 封装到p_command[50]当中去。
(2)利用上面生成返回的p_command[50]这个字串再通过 deal_response(p_command,res_info,&msg_id)函数
   来解析出当时通过make_request_msg()函数封装到里面的buffer = "250-filename"这条消息。 并把它分解成"250-"和"filename"这两部分。

我的感觉可能是函数当中调用的函数内部临时变量 在程序结束后并没把结果返回到函数外面就已经销毁。 所以在main函数当中
没有得到函数执行完后的 变量结果。 所以希望各位帮忙下 。怎样使函数当中的 变量结果能够在 main函数里显示出来啊?
可能用到指针和引用一些方法  是不是??

|
你先测试单个函数,看功能正常不?

|
有好几个错误,都给你改了

#include 
#include 
#include 

struct STRU_HEAD
{
        int length;
        unsigned char version;
        unsigned char type;
        unsigned char encrypt;
        unsigned char reserved;
        
};

//封装包头和消息体
int make_request_msg(char* p_command,unsigned char command_type,char* buffer)
{
        //封装包头
        char* tmp = p_command;

        struct STRU_HEAD head;
  //    head.length = 8+sizeof(buffer); //sizeof(buffer)必为4,所以改成下面的
head.length = 8+strlen(buffer);
        head.version = 2;
        head.type = command_type;
        head.encrypt = 0x01;
        head.reserved = 0x00;

        memcpy(p_command,&head.length,sizeof(head.length));
        p_command += sizeof(head.length);
        memcpy(p_command,&head.version,sizeof(head.version));
        p_command += sizeof(head.version);
        memcpy(p_command,&head.type,sizeof(head.type));
        p_command += sizeof(head.type);
        memcpy(p_command,&head.encrypt,sizeof(head.encrypt));
        p_command += sizeof(head.encrypt);
        memcpy(p_command,&head.reserved,sizeof(head.reserved));
        p_command += sizeof(head.reserved);

        //封装消息体
        memcpy(p_command,buffer,strlen(buffer));
        p_command += strlen(buffer);
        printf("The make_request_msg p_command is : %sn", p_command);//这是要打印什么?p_command已经指向包末尾了,
        return (int)(p_command-tmp); //就算是指向包头的起始地址,也不能打印,因为包头中含有'',(就是你那个保留值reserved),后面的字符串都被忽略了

}

// 解析上面make_request_msg()函数所封装的消息包 到res_info 和 msg_id 两部分当中去
int deal_response(char* buffer,char* res_info, unsigned int *msg_id)
{
        char* tmp;
        char tmp_msg_id[10]={0};
        printf("The deal_response buffer = [%s]n",buffer); //上面说了为什么不能打印
        tmp =NULL;
        
        if(0 != buffer[0])
        {
                tmp = strchr(buffer+8,'-'); //找-应该跳过前面的8个字节
                if(tmp != NULL)
                {
                        strncpy(tmp_msg_id,buffer+8,(tmp-buffer-8));//找id也应该跳过前面的8个字节
                        *msg_id = atoi(tmp_msg_id);
                        strcpy(res_info,tmp+1);
                }
                return 0;
        }
  printf("The deal_response msg_id is : %dn", *msg_id);
  printf("The deal_response res_info is : %sn", res_info);
        return 1;
}


int main(void)
{
    char p_command[50] = {0};
    char res_info[68] = {0};
    unsigned int msg_id = 0;
    char *buffer = "250-filename";
    unsigned char command_type = 3;
    int length ;

    length = make_request_msg(p_command, command_type,buffer);
    printf("The main p_command is %sn", p_command); //必是乱码
    printf("The main message length is %dn", length);
    
    deal_response(p_command,res_info,&msg_id);
    printf("The main ret_info is %sn", res_info);
    printf("The main msg_id is %ldn", msg_id);

     return 0;
}


|
由于昨晚改的匆忙,还有一点没有提到:
if(0 != buffer[0])这里是不对的,因为buffer[0]是消息包的长度,必>=8,
该成
if(8!= buffer[0])

|
printf("The main p_command:length: %dn",*p_command);
printf("The main p_command:version: %dn",*(p_command+4));
printf("The main p_command:type: %dn",*(p_command+5));
printf("The main p_command:encrypt: %dn",*(p_command+6));
printf("The main p_command:reserved: %dn",*(p_command+7));
printf("The main p_command:msg: %sn",p_command+8);

|
uping

    
 
 

您可能感兴趣的文章:

  • 大家好!我最近一个浏览器的原代码不知道怎么编译运行。。请帮帮忙?
  • 兄弟们,请帮帮忙吧,关于LINUX 的调度和时钟中断处理代码的分析!在线等待啊。。。:(
  • 现急需bmp文件转换成jpg文件的java源代码,请高手们帮帮忙,分数可再加。
  • 一个简单的代码问题,请大虾进来帮帮忙!急!
  • 熟悉C++和Java的高手请务必帮帮忙,我现在要将一种语言的源代码改成另一种
  • Linux汇编代码...各位帮帮忙
  • socket编程 总是accept error 新手入门 希望大家帮帮忙 具体代码如下
  • 各位老师帮帮忙,帮我看下服务端代码
  • 为什么我的这段代码编译不过去?那位大哥帮帮忙!谢谢!
  • 把一个表的记录显示在列表框中,代码出错,请各位帮帮忙,谢谢!!!
  • 进来帮帮忙....帮我改程序OK?..关于聊天室功能.里面有源代码.....
  • (高分)谁写过linux下的ftp客户端(访问linux服务器),请帮帮忙!有代码也行!
  • 我用java做的applet站内搜索程序,不能搜索中文,那位大虾能帮帮我?代码如下:
  • 大家帮帮菜鸟,看我这几行代码是怎么回事!
  • 大虾们,快来帮帮我把,这段代码怎么了?
  • 求有关socket等通讯方面的源代码,以供参考,希望大家帮帮我!谢谢
  • 关于把<转化成<的问题帮我看一下代码!!帮帮
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下有没有能编译出16bit代码的C语言编译器?
  • windows下如何把汇编代码和C代码编译成一个程序呢?
  • jbuilder4.0 企业版能否把代码编译成在特定平台上运行的代码
  • 使用gcc编译器进行代码编译出来的程序是否遵循gpl协议
  • 问:用g++编译通过的代码,为啥用gcc不可以?(附代码)
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 怎样看到java程序经过编译后的代码内容(bytecode的)或者在bytecode在JVM执行时JVM所解析的代码
  • 使用 C# 动态编译代码和执行的代码
  • 如何编译一个包含用户级代码和内核级代码的程序
  • 有人说用vc++写的程序,代码可以直接拿到linux下找编译器,就可以编译,是真的吗?
  • 谁能告诉我早期LINUX内核的源代码和C编译器的源代码,哪能找到!谢谢!要多少分都给!
  • linux 代码修改后编译
  • 刚下载一个内核源代码,怎样将它编译出来,然后安装运行呢?
  • 编译代码结构问题
  • 二进制安装和源代码编译安装,有什么区别?
  • 如何重新编译修改后的Linux内核源代码?
  • 如何把java代码编译成*.exe的应用程序
  • 关于《GNU Emacs Lisp编程入门》这本书里所说的“字节编译代码”是什么东东?
  • 求助 程序中添加互斥锁代码后编译怎么通不过 ?
  • 求JAVA编译器的源代码!
  • javascript 添加到收藏夹和书签代码示例
  • 在JBuilder中,为什么编写的代码中,当代码出现关键字时,后面的部分代码就移位了,当在有关键字的那些代码行进行选择时,也会出现鼠标位
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 为什么两行代码间不加入其他代码就崩溃,而加入了日志代码后就不崩溃?
  • JSP中清空cookie代码参考
  • 在ubuntu8.10 新立得中安装anjuta,为什么没有代码提示功能,怎么做才有,还有自动代码补全和代码提示有什么区别,
  • Python获取网页编码的方法及示例代码
  • 到底怎么样的代码算是有效代码?请教了。。
  • HTML网页中的html body onload自动跳转方法介绍及自动跳转代码示例
  • 如果要研究源代码以提高自己,哪一个开放源代码的软件比较合适?
  • php通过socket_bind()设置IP地址代码示例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3