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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Socket Send 带多指针的结构体,变长字符串,string char[] 等等。。
楼主网上找了很久很久,都没有找到Socket Send 带多指针的结构体的方法,有说发数组的,有说只能发一个指针的,但是我接下来要说的是,发送带多指针的结构体; 1.Socket的初始化我就不写了,网上很多,而且很固定; 2.定义一个多指针的结构体; struct SendMsgForMat { char* Msg; //错误信息 char* BigBarcode; //
Socket Send带指针的结构体以及不定长数据
一般来说,我们使用Send发送结构体数据,结构体里面的数据,一般都是用定义好了的char 数组来发送的,如下例子: struct Sendbuf { char encode; //数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1 4. char encrypt; //加密类型。0表示不加密 char v
C语言socket通信发送结构体的问题
Socket 通信中需要发送/接收结构体时,不能直接发送/接收结构体,需要先把结构体进行转化,如: typedef struct  {     int client_sockfd;     char client_name[30];     char buff[100]; }message; 在发送时需要先定义一个数组: char snd_buf[1024] = {0};再定义一个结构体指针或变
使用socket发送struct结构体内容
可使用如下方式发送struct结构体内容: struct carinfo{ char pno[16]; char type[8]; char name[16]; char address[64]; char model[32]; char use_character[16];}; 发送端: struct carinfo carinf_1={0};
Socket编程中用send发送结构体
最近在开发一个Linux下的聊天软件,好久没有做C语言的开发了,感觉到很多东西已经生疏了,这下又碰到用Socket传递结构体的问题,google了一下,发现也有不少朋友遇到同样的问题,所以就打算写出自己的解决办法,跟大家分享。Socket中的send函数可以发送字符串,但不能直接发送结构体,因此在发送端先把结构体转成字符串,然后用send发送,在接收端recv字符串,再转换成原先的结构体,这个就是解
C语言udp socket发送结构体
利用udp发送数据时,可能会发送不同类型的数据,多种类型数据通过一条udp报文发送需要,因此需要建立一个结构体对需要发送的数据进行定义。但是udp发送的是char型参数,因此需要将结构体转换为char型。 结构体和char转换有很多种方法,每种方法所使用的条件也不同,一般来说,对于定长的结构体来说比较简单,变长的结构体的转换较为复杂。 在此介绍定长结构体的转换与发送的简单方法,当然应用
Java 与 C socket通信传输结构体消息/Java解析C语言结构体
Linux C与java实现 socket通信,网上部分例子通信消息格式都是传递的字节流消息,直接传递char型数组消息。而在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。这时候传输的内容如果保存在char型数组中,编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的
Socket发送和接收变长结构体
//Server端代码 [cpp] view plaincopyprint? #include   #include   #include   #include   #include   #include       #include   //使用不定长的结构体发送数据的关键在于:结构体变量必须分配到堆中,而不是栈中   //即只能用malloc或者ne
TCP-socket发送结构体类型数据
UDP传输模式是数据报,TCP传输模式为字节流,字节流与数据报区别在于有边界与无边界。例如:TCP客户端发送了三个数据包,开的缓存足够大服务端一次可接收三个数据包的数据,这就是无边界。UDP客户端发送了三个数据包,就算开的缓存足够大服务端一次也只能接收一个数据包,这就是有边界。 还有就是协议会维护源地址和目的地址直到协议要求断开连接,这就决定了TCP不能进行广播和多播。 如何使用TCP
Socket传输结构体数据注意事项
【1 背景】 在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输。 接收端也必须通过同样的结构体进行解析。 但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错;2)接收数据不完整;3)解析为乱码等的Bug。 【2 举例】 如下是接收端解析数据为乱码甚至崩溃的一类常见错误。