socket 怎么发送一个变量值
现在在服务端有socket的一个send函数,是这样的send(new_fd,&voltage,8,0);这个函数不用说明应该知道什么意思吧,我现在是要发送一个变量vol...
现在在服务端有socket的一个send函数,是这样的send(new_fd,&voltage,8,0);这个函数不用说明应该知道什么意思吧,我现在是要发送一个变量voltage的值,但是这个变量是floate型的,我已经把它转化为char型的还是不对,结果还是不对。请问下怎么才能把voltage发送到客户端?
现在还有个新问题,我的server是在linux下的,而client在windows下c++编的,send出来的数据在windows下显示一团乱码,我不知道发送的数据是不是正确的,大侠,求助! 展开
现在还有个新问题,我的server是在linux下的,而client在windows下c++编的,send出来的数据在windows下显示一团乱码,我不知道发送的数据是不是正确的,大侠,求助! 展开
6个回答
推荐于2018-03-29
展开全部
可以定义一个结构体变量,结构体里面有float、double类型的数据,然后发送;
参考如下:
struct person{
char name[20];
int age;
float high;
};
/*可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可。*/
//发送方代码如下:
char temp[100]; //传送的字符串
struct person p1; //声明一个需要传送的结构体
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp)); //对该内存段进行清 0
memcpy(temp,&p1,sizeof(person)); //把这个结构体中的信息从内存中读入到字符串temp中
//接下来传送temp这个字符串就可以了
sendto(sock,temp,sizeof(person),0,(SOCKADDR*)&addSer,sizeof(SOCKADDR));
//这样这个结构体的信息就发送到addSer相应的套接字了
/*接收方代码如下:
同样需要定义字符串和相同的结构体对象*/
char temp[100]; //传送的字符串
struct person p2; //声明一个存放接收信息的结构体
memset(temp,0,sizeof(temp)); //清内存
//下面是接收字符串的代码
recvfrom(sock_listen,temp,sizeof(temp),0,(sockaddr*)&addCli,&len);
//下面对字符串信息进行还原,将其变成的结构体数据
memcpy(&p2,temp,sizeof(person)); //解析过程
//下面就可以对p2中的数据进行各种操作了,也完成了结构体数据的传送。
参考如下:
struct person{
char name[20];
int age;
float high;
};
/*可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可。*/
//发送方代码如下:
char temp[100]; //传送的字符串
struct person p1; //声明一个需要传送的结构体
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp)); //对该内存段进行清 0
memcpy(temp,&p1,sizeof(person)); //把这个结构体中的信息从内存中读入到字符串temp中
//接下来传送temp这个字符串就可以了
sendto(sock,temp,sizeof(person),0,(SOCKADDR*)&addSer,sizeof(SOCKADDR));
//这样这个结构体的信息就发送到addSer相应的套接字了
/*接收方代码如下:
同样需要定义字符串和相同的结构体对象*/
char temp[100]; //传送的字符串
struct person p2; //声明一个存放接收信息的结构体
memset(temp,0,sizeof(temp)); //清内存
//下面是接收字符串的代码
recvfrom(sock_listen,temp,sizeof(temp),0,(sockaddr*)&addCli,&len);
//下面对字符串信息进行还原,将其变成的结构体数据
memcpy(&p2,temp,sizeof(person)); //解析过程
//下面就可以对p2中的数据进行各种操作了,也完成了结构体数据的传送。
展开全部
发送都是char类型的,我这里有个传送结构体的代码,使以前我做过的,结构体里面有float double类型的数据,你可以参考下,说明如下:
假设需要传送的结构体如下:
struct person{
char name[20];
int age;
float high;
};
可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可。
发送方代码如下:
char temp[100]; //传送的字符串
struct person p1; //声明一个需要传送的结构体
//以下是结构体的初始化信息
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp)); //对该内存段进行清 0
memcpy(temp,&p1,sizeof(person)); //把这个结构体中的信息从内存中读入到字符串temp中
//接下来传送temp这个字符串就可以了
sendto(sock,temp,sizeof(person),0,(SOCKADDR*)&addSer,sizeof(SOCKADDR));
//这样这个结构体的信息就发送到addSer相应的套接字了
接收方代码如下:
同样需要定义字符串和相同的结构体对象
char temp[100]; //传送的字符串
struct person p2; //声明一个存放接收信息的结构体
memset(temp,0,sizeof(temp)); //清内存
//下面是接收字符串的代码
recvfrom(sock_listen,temp,sizeof(temp),0,(sockaddr*)&addCli,&len);
//下面对字符串信息进行还原,将其变成我们的结构体数据
memcpy(&p2,temp,sizeof(person)); //解析过程,将字符串的内容写入到p2所在内存完成解析
下面就可以对p2中的数据进行各种操作了,也完成了结构体数据的传送。
假设需要传送的结构体如下:
struct person{
char name[20];
int age;
float high;
};
可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可。
发送方代码如下:
char temp[100]; //传送的字符串
struct person p1; //声明一个需要传送的结构体
//以下是结构体的初始化信息
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp)); //对该内存段进行清 0
memcpy(temp,&p1,sizeof(person)); //把这个结构体中的信息从内存中读入到字符串temp中
//接下来传送temp这个字符串就可以了
sendto(sock,temp,sizeof(person),0,(SOCKADDR*)&addSer,sizeof(SOCKADDR));
//这样这个结构体的信息就发送到addSer相应的套接字了
接收方代码如下:
同样需要定义字符串和相同的结构体对象
char temp[100]; //传送的字符串
struct person p2; //声明一个存放接收信息的结构体
memset(temp,0,sizeof(temp)); //清内存
//下面是接收字符串的代码
recvfrom(sock_listen,temp,sizeof(temp),0,(sockaddr*)&addCli,&len);
//下面对字符串信息进行还原,将其变成我们的结构体数据
memcpy(&p2,temp,sizeof(person)); //解析过程,将字符串的内容写入到p2所在内存完成解析
下面就可以对p2中的数据进行各种操作了,也完成了结构体数据的传送。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果只是要传送1个float,那改成
send(new_fd,(char *)&voltage,sizeof(float),0);
但是如果,以后还要传送和其他类型的数据混合的数据就比较麻烦了。
首先不论是TCP的send还是UDP的sendto
都只接受char数组的指针作为参数。
那么,要发送其他类型的数据,只能把操作进行到字节的程度。
比如,要传送一个double和一个int的混合数据,那么发送的
长度为:sizeof(double)+sizeof(int)
用操作把double的每个字节依次放到字符数组里,然后再把int的每个字节依次放进去数组就可以了。
然后执行发送。
到了另一端,用逆操作解析就可以了
提供你几个字和字节的宏:
MAKEWORD()这个你肯定知道。
LOBYTE(a)取出2字节长度变量a的低字节
HIBYTE(a)取出2字节长度变量a的高字节
HIWORD(a)取出4字节长度变量a的低字节
LOWORD(a)取出4字节长度变量a的高字节
send(new_fd,(char *)&voltage,sizeof(float),0);
但是如果,以后还要传送和其他类型的数据混合的数据就比较麻烦了。
首先不论是TCP的send还是UDP的sendto
都只接受char数组的指针作为参数。
那么,要发送其他类型的数据,只能把操作进行到字节的程度。
比如,要传送一个double和一个int的混合数据,那么发送的
长度为:sizeof(double)+sizeof(int)
用操作把double的每个字节依次放到字符数组里,然后再把int的每个字节依次放进去数组就可以了。
然后执行发送。
到了另一端,用逆操作解析就可以了
提供你几个字和字节的宏:
MAKEWORD()这个你肯定知道。
LOBYTE(a)取出2字节长度变量a的低字节
HIBYTE(a)取出2字节长度变量a的高字节
HIWORD(a)取出4字节长度变量a的低字节
LOWORD(a)取出4字节长度变量a的高字节
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样试试吧
发送端:
float voltage = .0;
send(new_fd, (char *)&voltage, sizeof(float), 0);
接收端:
int len = sizeof(float);
char data[len + 1];
int recv(sk,data,len, 0);
data[len] = '\0'
float voltage = atof(data);
发送端:
float voltage = .0;
send(new_fd, (char *)&voltage, sizeof(float), 0);
接收端:
int len = sizeof(float);
char data[len + 1];
int recv(sk,data,len, 0);
data[len] = '\0'
float voltage = atof(data);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你就用float型的变量的地址就行啊,后边写上float形变量的长度,一般是2个字节
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询