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都不对的话只能往上找了.