免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2718 | 回复: 3
打印 上一主题 下一主题

socket 发送指针数据的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-08 14:40 |只看该作者 |倒序浏览
定义了结构如下:
#pragma pack(1)
struct __CollectorCommCmd
{
    uint32_t code;
    uint32_t len;   
    char * pData;
  
    __CollectorCommCmd()
    {
    pData = NULL;
    }

    ~__CollectorCommCmd()
    {
        if(pData != NULL)
        {
            delete pData;
        }
    }
}
;
#pragma pack()写了如下函数
HRESULT CCollector::sendCmdToIB(__CollectorCommCmd * i_p_cmd)
{
    HRESULT ret;   
    {
        int  cmd_len = sizeof(i_p_cmd->code) +sizeof(i_p_cmd->len) + i_p_cmd->len;
        char ** buff ;
        *buff = new char[cmd_len];
        memcpy(*buff, i_p_cmd, (sizeof(i_p_cmd->code) + sizeof(i_p_cmd->len)));
        //问题可能在这里, 解析到此处会访问非法指针
        memcpy(*buff +8,i_p_cmd->pData),i_p_cmd->len);
        ret = collector_comm->sendToCommB(*buff, cmd_len);
        delete [] buff;
    }   
    return ret;
}

HRESULT CCollectorComm::sendToCommB(const char * i_p_buff, const int & i_r_len)
{
    HRESULT ret = sendToCommForce(b_sockfd, i_p_buff, i_r_len);
    return ret;
}


HRESULT SockComm::sendToCommForce(const int & i_r_sockfd, const char * i_p_buff, const int & i_r_len)
{
    ......//封装具体的 socket 的write
    return S_OK;
}

严重怀疑是sendCmdToIB函数有问题,所以作了以下写法

HRESULT CCollector::sendCmdToIB(__CollectorCommCmd * i_p_cmd)
{
    HRESULT ret;   
    {
        int  cmd_len = sizeof(i_p_cmd->code) +sizeof(i_p_cmd->len) + i_p_cmd->len;
        
        char  *buff = new char[cmd_len];
        memcpy(buff, i_p_cmd, (sizeof(i_p_cmd->code) + sizeof(i_p_cmd->len)));
        //问题可能在这里
        memcpy(buff +8,i_p_cmd->pData),i_p_cmd->len);
        ret = collector_comm->sendToCommB(buff, cmd_len);
        delete [] buff;
    }   
    return ret;
}
//这个写法能成功传送数据,命令头和命令长度正确,但是数据乱码,
希望高手能帮忙,在包结构不改变的情况下,帮忙修改一下

封装数据的操作 如下

HRESULT FUNC(__PerfTaskItem * temp_perf_task_item)
{
   HRESULT ret;
   __CollectorCommCmd  cmd;
   cmd.code  = CMD_OUT_PERF_TASK;//#define
   cmd.len = sizeof(__PerfTaskItem);
   cmd.pData= (char *)malloc(sizeof(__PerfTaskItem)));
   memcpy(cmd.pData,temp_perf_task_item,sizeof(__PerfTaskItem));
   ret =sendCmdToIB(&cmd);
   return  ret;
}

知道了数据结构的长度,根据数据结构长度来分配内存

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
2 [报告]
发表于 2007-09-08 20:41 |只看该作者
buff没初始化

论坛徽章:
0
3 [报告]
发表于 2007-09-10 10:48 |只看该作者
memcpy(buff +8,i_p_cmd->pData),i_p_cmd->len);
溢出了,复制长度比buff大
char  *buff = new char[cmd_len+8];
这样试试

论坛徽章:
0
4 [报告]
发表于 2007-09-11 16:58 |只看该作者
经过测试,发现在发送方先使用了
memcpy(buff,i_p_cmd,(sizeof(i_p_cmd->code)+sizeof(i_p_cmd->len)));

copy 了整形数据, 能解析成功, 但是
memcpy(buff+8,i_p_cmd->pData,i_p_cmd->len); 就开始出现乱码,

直拉打出i_p_cmd->pData 数据又是正常的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP