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

带数据指针的结构体使用socket怎么发送接收?坐等结贴

2012-09-23 
带数据指针的结构体使用socket如何发送接收?坐等结贴有这样的一个结构体如下, m_pData用于存储一张图片数

带数据指针的结构体使用socket如何发送接收?坐等结贴
有这样的一个结构体如下, m_pData用于存储一张图片数据,

C/C++ code
typedef struct tagFrameHdr{    short     m_byMediaType; //媒体类型    char *    *m_pData;       //数据缓冲            int    m_dwDataSize;  //m_pData指向的实际缓冲大小缓冲大小    }FRAMEHDR,*PFRAMEHDR;
发送的时候我先
char *pBuf = (char *)malloc(0x100000);
...赋值
FRAMEHDR fr;
fr.m_pData = pBuf
send( socket1, (char*)&fr, sizeof(fr) + _dwDataSize);应该是对的吧?

但是我接收的时候,int iLen = recv(, pBuf, 0x100000); //最大数据不超过1M。所以我就是用最大数据
显示的iLen和发送的数据长度是一致的,但是
将 FRAMEHDR *p = (FRAMEHDR *)pBuf后, p->m_pData显示的指针是无效的,调试的时候显示的是Bad Ptr,请问一下,像这样的结构,我在接收端该如何接收呢?

谢谢了

[解决办法]
把数据都取出来,序列化以后再发送
[解决办法]
结构体中不能再附带指针了。因为你第二个参数是指针。
所以你真正要的效果是:
send( socket1, (char*)&(fr.byMediaType), sizeof(fr.byMediaType));
send( socket1, (char*)(fr.m_pData), m_dwDataSize);
send( socket1, (char*)&(fr.m_dwDataSize), sizeof(fr.m_dwDataSize));



[解决办法]
探讨
引用:
定义FRAMEHDR 的m_pData 时,定义成m_pData[0x100000]
这样你的问题就都解决了...

以后数据再大的话,栈上就不够了,以后可能是2M或者更大

[解决办法]
主要是你的数据量比较大,所以你需要定义自己的数据包格式,即应用层数据包格式,就像你的FRAMEHDR结构体一样

其中有个字段m_pData是你主要发送的数据内容,其他字段配合发送

如果你要是指针的话,那么实际上结构体内存中存的只是个指针,即是个32位的unsigned int值,但要是数组的话,那么就是一块内存。要想知道当前的结构体到底是些什么东西,你可以调试的时候看监视或者看内存,都可以看到。你看到实际的东西就是要发送的东西...

不知道你有没有稍微明白一点,我的表达有限...
[解决办法]
探讨
引用:
结构体中不能再附带指针了。因为你第二个参数是指针。
所以你真正要的效果是:
send( socket1, (char*)&(fr.byMediaType), sizeof(fr.byMediaType));
send( socket1, (char*)(fr.m_pData), m_dwDataSize);
send( socket1, (char……

[解决办法]
memcpy,你结构体中用的是为m_pData分配内存用的new么?new不行,必须数组才可以
[解决办法]
探讨
引用:
引用:
引用:
定义FRAMEHDR 的m_pData 时,定义成m_pData[0x100000]
这样你的问题就都解决了...

以后数据再大的话,栈上就不够了,以后可能是2M或者更大


所以啊,你可以定义一个固定大小,数据包传过去后,到另一端在组合,就是部长所谓的序列后发生

不太明白,像这样带特殊指针的结构体……

[解决办法]
恩,应该是楼主最后想的那样,结构体中指明有多少数据,接受的时候,先接到结构体,然后按照结构体中指明的数据长度进行数据接收就可以了、、、、、、

问题已解决,额是来蹭分的,呵呵

热点排行