关于网友提出的“ Java和c++的Socket通信如何发送结构体?”问题疑问,本网通过在网上对“ Java和c++的Socket通信如何发送结构体?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: Java和c++的Socket通信如何发送结构体?
描述: 我这边的c++程序即时服务端,又是客户端,应该如何接收和打包结构体给java端?
struct A
{
int id;
string msg;
};
解决方案1: Socket发送的都是数据流, 结构体必须序列化成字节流后才可以发送.
C++ 和 Java通讯要注意编码问题.
协议简单的话,可以自己写.
复杂的话可以用pocobuffer之类的开源
解决方案2: 底层通讯的send和recv函数应该都是面向字节流的。
把struct A
{
int id;
string msg;
};
修改为
struct A
{
int id;
char msg[MAX_LEN];
};
假设 A是字节对齐的
//C++侧发送
A a;
a.id=0x12;
strcpy(a.msg, "hello"); //a.msg = "hello"
发送函数为send(sockid, &a, (sizeof(a,id) + strlen(a.msg)));
那么实际你发送出去的字节流为(十六进制):
12 00 00 00 68 65 6c 6c 6f
小端0x12 'h' 'e' 'l' 'l' 'o'
//Java侧接收,
你使用java的接受函数,收到的也是字节流 12 00 00 00 68 65 6c 6c 6f
解决方案3: 现在做的游戏,其中有点点是C++与C#的网络通讯。我的做法是这样的:
1、C++定义一个结构体,是所有结构体的头,包含了版本号、数据长度、数据类型等定义。
2、所有可能通过网络传输的数据结构,都必须在头部包含上述结构体。
3、所有结构体,全部采用4字节对齐,如果不能对齐的,插入一些无意义的数据,强制对齐。
4、C#端收到后,先解析头,根据头的信息,再解析生成对应的结构体。
解决方案4: 数据包总共字节数len(4字节) +
本数据包代表的协议号(4字节)+ //根据协议号,得知这个包发的是struct A还是struct B
id(4字节) +
msg内容(X字节) //X = len - 4 - 4 - 4;既len = 4 + 4 + 4 + X
解决方案5: string是对象,不是一段内存。不适合放在结构体中,也不适合放在IP包中。
解决方案6: 写到byte[]发送
以上介绍了“ Java和c++的Socket通信如何发送结构体?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3666425.html