socket传输结构体问题

peter115 2003-08-20 01:15:39
我现在想在网络上利用socket传输一个结构体
例如:
struct student
{
char *name;
int age;
float score;
};
当我把结构体中的name改为传递数组的时候就可以传输都没有问题,
但是我如果将它改为上面说的指针就不行,我的拷贝是利用
首先定义一个发送缓冲区char buf[100];
strust student p;
p.name = (char*)malloc(sizeof(char) * 20);
strcpy(p.name,"Peter");
然后调用memcpy(buf,p,sizeof(struct student));
我在服务器发送的时候打印拷贝的结构体中的数据的时候都是可以的,但是
在客户端接收的时候总是结构体中的另外两项都可以接收到,就是name一项为空,
当我把指针改为数组就可以,我不知是为什么,我已经分配了空间呀,也将字符串
拷贝了呀!但是为什么数组就可以而指针就不行呢?
...全文
497 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
netsys2 2003-09-16
  • 打赏
  • 举报
回复
楼上的众多同志们说得很清楚了,

你别传指针,没有意义!

只有传数组。

或者修改协议,传结构前先传大小,然后再发数据,这样可以处理变长的数据
esdn 2003-09-16
  • 打赏
  • 举报
回复
迷兔说的真有意思,辉应该重新考虑一下你船指针过去干什么?并不要机械的认为什么都用指针,网络的目的只是忠实地传输你放到缓冲区的bytes,不管它是指针还是数组。
robyman 2003-09-15
  • 打赏
  • 举报
回复
该继续学习C语言
newsunsmartlink 2003-08-21
  • 打赏
  • 举报
回复
我觉得你的思路有问题,一般的做法是定义你自己的消息头,消息中有一项是包体数据的长度。在数据发送/接收时没有什么结构体、指针(指针对异地没意义)的概念,就是本地一块内存数据块。
peter115 2003-08-21
  • 打赏
  • 举报
回复
那我现在就需要传送指针那就没有办法在接收端这端处理了吗?而且如果是用数组的话
那么每次都发送一个固定大小的数组过去,这样非常浪费资源,我每次可能都不一样呀
指针灵活一些,所以请各位教我!
jiangnan2062 2003-08-21
  • 打赏
  • 举报
回复
我同意creekcpj(迷兔) 的说法。我以前也遇到过这个问题。另:在网络上传指针,我认为没什么意义。因为在程序的运行期间,指针对本地数据有作用。网络另一端即使收到一个指针数据,对它也没有意义。
peter115 2003-08-20
  • 打赏
  • 举报
回复
那我应该怎样在接收端处理那个指针呢?以后如果在网络上传指针应该
怎样处理呢?
creekcpj 2003-08-20
  • 打赏
  • 举报
回复
你完全没搞清楚指针和数组的区别和sizeof函数的特点。
sizeof(struct student)返回student结构的大小,这其中,age,score域各4 bytes
没什么问题。name是个指针,在编译器中也会分配四字节的内存以存放它,也就是说
name是四字节,其值类似于:0x3F68343C的形式,而name中的内容则存放在内存中的
0x3F68343c地址为起始的内存块中。student结构和name指向的数据在内存中是完全分
开的,sizeof怎么会把它算到student结构中呢?sizeof(struct) = 12;copy 到buf中
的数据绝对没有你的“Peter”,只有一个指针0x3F68343c;

所以,在memcpy(buf,p,sizeof(struct student));再加一句:
strncat(buf,p.name,strlen(p.name));
才算把"Peter" copy 到了buf中。

还有个问题,你传过去后要怎么处理你的那个指针?0x3F68343c在另一台机子上指向
什么?MM照片还是恐龙写真?
danceflash 2003-08-20
  • 打赏
  • 举报
回复
你拷贝到缓冲区的是一个指针,也就是一个地址,发过去好像没有什么用吧?

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧