2 xiaopang1122 xiaopang1122 于 2016.01.14 15:30 提问

C语言 socket 如何发送带指针的结构体?

发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出。
但是接收的时候,怎么接收到结构体中?thanks!

5个回答

u014116643
u014116643   2016.01.14 17:28
已采纳
    发送:
    struct f;
char *ffff[sizeof(f)];
memcpy(ffff, &f, sizeof(f));

    接收:
    struct f;
    ffff为收到的数据
    memcpy(&f, ffff, sizeof(ffff));
xiaopang1122
xiaopang1122 你这个不能发送带指针的结构体,带指针这么发送会出现Segmentation fault 错误信息
接近 2 年之前 回复
CSDNXIAOD
CSDNXIAOD   2016.01.14 15:33

C语言---结构体指针
C语言--结构体中的指针
C语言--结构体中的指针
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

xiaopang1122
xiaopang1122 不是我想要的答案。。。。
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.01.14 15:48

发指针是没有什么用处的,因为对方同样数值的指针指向的内容你无法控制。
发送结构体,你实际想要的结构体内指针指向的内容。所以你必须将内容发到对方,然后重建结构体的指针值。

91program
91program 回复Devin-zhou: 是的,此处需要通讯协议支持。先完成结构体的传输,再传输指针的内容。接收方接收到内容后,将内容的地址赋值到结构体中。
接近 2 年之前 回复
xiaopang1122
xiaopang1122 回复91program: 已经把值发送到对方去了,但是收内容的时候怎么收到结构体中(结构体是已知的)?是重新赋值嘛?
接近 2 年之前 回复
91program
91program 当然,如果你只是想要结体体指针的数值,就直接发结构体就可以的。但对方不能用此结构体的指针去取指针的内容。
接近 2 年之前 回复
qq_27183003
qq_27183003   Ds   Rxr 2016.01.14 15:53
 struc AA  a;
 char buf[100];//保存接收的结构体变量
 a=*((sturc AA *) buf);


qq_27183003
qq_27183003 这不是已经把接收的数据放到结构体变量了吗?你是想把数据放到一个数组,把数组指针赋给结构体里的指针成员吧。
接近 2 年之前 回复
xiaopang1122
xiaopang1122 嗯, 还有如何把接受到的数据 保存到 已知的结构体中?
接近 2 年之前 回复
xiaopang1122
xiaopang1122   2016.01.14 18:09

static char* merge_msg(int port, char* ipaddr, char* msg, int ipszie, int msgsize)
{

char p1, *p2;
char
buffer = malloc(sizeof(int)+ipszie+msgsize);
if(buffer == NULL)
{
return NULL;
}
memset(buffer, 0, sizeof(int)+ipszie+msgsize);

p1 = ip_new(ipszie);
if(p1 == NULL)
{
    free(buffer);
    return NULL;
}


p2 = msg_new(msgsize);
if(p2 == NULL)
{
    ip_delete(p1);
    free(buffer);
    return NULL;
}

my_itoa(port, buffer);
my_itoa(ipszie, p1);
my_itoa(msgsize, p2);

strcat(buffer, p1);
strcat(buffer, ipaddr);
strcat(buffer, p2);
strcat(buffer, msg);

return buffer;

}
.......

//发送前 把结构体转换成 字符串

static char* getip_from_server(char* msg, int ipsize)
{
char* ip = ip_new(ipsize);
if(ip == NULL)
{
return NULL;
}

int count = 1;
if(ipsize >= 10)
{
    count = 2;
}
ip = substring(msg, ip, sizeof(int)+count, ipsize);

return ip;

}

static char* getmsg_from_server(char* msg, int msgsize)
{
char* buffer = msg_new(msgsize);
if(buffer == NULL)
{
return NULL;
}

int count =  strlen(msg) - msgsize;

buffer = substring(msg, buffer, count, msgsize);

return buffer;

}
//数据收到后拆分下来。。

........

不知道这样写 有没有问题?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!