java和lora通信_Java与C++Socket通讯注意

本文介绍了在Java和C++之间进行Socket通信时,需要注意的字节序(主机字节序与网络字节序)转换问题,以及字节对齐的影响。在C++中,需要使用htons, htonl等函数进行字节序转换,而在Java中字节序默认遵循big-endian规则。此外,文章提到了C++结构体的字节对齐可能导致的大小差异,以及如何通过设置对齐方式避免填充字节。" 123223441,11600741,Gromacs分子动力学模拟:gmx_mmpbsa自由能计算解析,"['算法', '分子模拟', 'Gromacs']
摘要由CSDN通过智能技术生成

c++与java进行socket通信时注意事项     因为java发送的都是网络字节序(big-endium),而c++是主机字节序(little-endium),所以当消息中有整型,浮点型(应尽量避免使用)的时候需要用htonl,htons,ntohl,ntohs等函数转换一下,字符串由于是单字节排序的不需要转换,但应注意c++字符串是以'/0'作为结束符的,如果找不到'/0'可能会出现一些乱码,所以接收的时候可以分配一个length+1的buffer用来接收消息.

举例:c++ server, java client,假设开发的是c++ server,那么:

java client--------->c++ server: c++ server需要调用ntohs,ntohl

c++ server--------->java client: c++ server需要调用htons,htonl

至于浮点型可以使用以下的函数转换:

float tcp_htonf(float f)

{

unsigned char *p, p0, p1;

if(htons(1) ==1) return f;

p =(unsigned char *)&f;

p0 =p[0];

p1 =p[1];

p[0] =p[3];

p[3] =p0;

p[1] =p[2];

p[2] =p1;

return f;

}

float tcp_ntohf(float f)

{

unsigned char *p, p0, p1;

if(ntohs(1) ==1) return f;

p =(unsigned char *)&f;

p0 =p[0];

p1 =p[1];

p[0] =p[3];

p[3] =p0;

p[1] =p[2];

p[2] =p1;

return f;

}

double tcp_htond(double d)

{

unsigned char *p, p0, p1, p2, p3;

if(htons(1) ==1) return d;

p =(unsigned char *)&d;

p0 =p[0];

p1 =p[1];

p2 =p[2];

p3 =p[3];

p[0] =p[7];

p[7] =p0;

p[1] =p[6];

p[6] =p1;??

p[2] =p[5];??

p[5] =p2;

p[3] =p[4];

p[4] =p3;

return d;

}

double tcp_ntohd(double d)

{

unsigned char *p, p0, p1, p2, p3;

if(ntohs(1) ==1) return d;

p =(unsigned char *)&d;

p0 =p[0];

p1 =p[1];

p2 =p[2];

p3 =p[3];

p[0] =p[7];

p[7] =p0;

p[1] =p[6];

p[6] =p1;

p[2] =p[5];

p[5] =p2;

p[3] =p[4];

p[4] =p3;

return d;

}

java代码发送结构体

最近给个朋友做个网站的客户端,使用C/S模式,Client为VC6开发,Server为Java,通过Socket通信。由于Client这边为C++,所以,在接受Java发过来的数据包时,需要知道发来的包的长度,所以,就要引入变长包的机制。

方法是:首先Server发送一个包头,如下:

// packet head

typedef struct tagPacketHead{

long PacketID;

long PacketLen;

}PacketHead;

包头后面跟上包体,其中包体的长度,就是上面结构体中的PacketLen,Clinet首先接受包头,因为包头是两边约定好的,所以可以直接Receive一个定长的消息,也就是这个包头的长度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值