首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

socket 发送指针数据的有关问题

2012-02-26 
socket 发送指针数据的问题socket发送指针数据问题定义了结构如下:struct__CollectorCommCmd{uint32_tcode

socket 发送指针数据的问题
socket   发送指针数据问题

定义了结构如下:
struct   __CollectorCommCmd
{
        uint32_t   code;
        uint32_t   len;
        //发送的指针数据会是任意的结构体
        char   *pData;
}
写了如下函数
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;
}
//这个写法能成功传送数据,命令头和命令长度正确,但是数据乱码,
希望高手能帮忙

[解决办法]
你的pData指向的东西是堆上分配的吗

[解决办法]
ok,你的pData是一个指针,指针指向一个段内存对吧。
你收到的数据怎么处理的??
是这样吗?

buf = recv();

__CollectorCommCmd *recvPack = (__CollectorCommCmd *)buf;

这样吗?这样的乱肯定是乱码的。


[解决办法]
没仔细看,不过有一点感想:写网络应用,对待好内存很重要,仔细一点就可以了。
------解决方案--------------------


sdudy
[解决办法]
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;
}
[解决办法]
#pragma pack(1)

pada指向的结构体加了上面一条,解包的地方定义的结构体也要上面一条
[解决办法]
i_p_cmd-> pData,这里数据对吗?
还是拷贝到buff中才出错.
i_p_cmd-> pData都不对的话只能往上找了.

热点排行