| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 673 人关注过本帖
标题:socket 发送指针数据问题
只看楼主 加入收藏
jsjqzhang
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-9-8
收藏
 问题点数:0 回复次数:2 
socket 发送指针数据问题
定义了结构如下:
#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;
}

//封装具体的 socket 的write
HRESULT SockComm::sendToCommForce(const int & i_r_sockfd, const char * i_p_buff, const int & i_r_len)
{
if(i_r_sockfd < 0 || i_p_buff == NULL || i_r_len < 0)
{
return E_ARGUMENT_INVALID;
}
else if(i_r_len == 0)
{
return S_OK;
}

int write_len = 0;
int len;
while(write_len < i_r_len)
{
if((len = write(i_r_sockfd, i_p_buff + write_len, i_r_len - write_len)) == -1)
{
return E_SYSCALL;
}

write_len += len;
}
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;
}
//这个写法能成功传送数据,命令头和命令长度正确,但是数据乱码,
希望高手能帮忙,在包结构不改变的情况下,帮忙修改一下
搜索更多相关主题的帖子: socket 指针 数据 pData pack 
2007-09-08 14:35
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
[CODE] char ** buff ;
*buff = new char[cmd_len];[/CODE]

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2007-09-08 16:43
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
memcpy(buff +8,i_p_cmd->pData),i_p_cmd->len);???????

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2007-09-08 16:58
快速回复:socket 发送指针数据问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018806 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved