您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> Java和c++的Socket通信如何发送结构体?

Java和c++的Socket通信如何发送结构体?

来源:网络整理     时间:2016/8/29 20:35:17     关键词:

关于网友提出的“ 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

相关图片

相关文章