今天遇到了socket传送结构体的问题。于是网上搜刮了一些idea。但是在具体编程中还是遇见了一些问题,在此记录一下。
我的结构体是这样的:
typedef struct info
{
int index;
int tag;
int len;
char *content;
}
在客户端和服务器端都知道这个结构体。于是代码如下:
客户端:
info data;
memset(&data,'\0',sizeof(data));
data.index = 1;
data.tag = 2;
data.len = 2;
data.content = "hahhakekekll";
if(send(sockfd,&data,sizeof(info),0) < 0)
printf("send error");
服务器端:
if((recv(sockfd,buf,MAXLINE,0)) < 0)
printf("recv error");
else
{
info data;
memset(&data,0,sizeof(data));
memcpy(&data,buf,sizeof(info));
printf("%d\n%d\n%d\n%s\n",data.index,data.tag,data.len,data.content);
}
运行程序,编译没有问题,但是运行的时候,客户端发送数据,发现data.content是乱码,其他的数据比如tag,index,len都是正确的。我开始以为是我在最后没有添加‘\0’的缘故。于是在info结构体添加了一项,就是content的长度。
typedef struct info
{
int index;
int tag;
int len;
int leng;
char *content;
}
然后在
if((recv(sockfd,buf,MAXLINE,0)) < 0)
printf("recv error");
else
{
info data;
memset(&data,0,sizeof(data));
memcpy(&data,buf,sizeof(info));
data.content[leng] = '\0';
printf("%d\n%d\n%d\n%s\n",data.index,data.tag,data.len,data.content);
}
发现还是错的,段错误。输出strlen(data.content)发现远大于我实际的数据。估计是这样的,数据毕竟在流上传输,以二进制。然后'\0'可能就遇到了。我也不知道具体什么原因。难道是我末尾没有定好位?但是我在末尾加了'\0'。难道这还不算吗?
反正char*content就是行不通。网上看了一些资料,发现都用的数组。于是将char *content 改成 char content[MAXLINE];
这样,
strcpy(data.content,"hahhgakdiwoi");
这样,能够运行了。传入数据没有问题。content能够正确显示。
我很疑惑了。为什么char * 出错了呢?char []与char *有很大区别吗?还是我哪里的细节没有做好?
小菜鸟不懂。
一次记录。