Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过qtcsocket发送结构_Qt - Fatal编程技术网

通过qtcsocket发送结构

通过qtcsocket发送结构,qt,Qt,我们是否可以将包含指向另一个结构的指针的结构,通过QTcpSocket套接字发送到在其他物理位置运行的程序的QTcpServer套接字,然后发送到该程序。我的代码将是这样的 <i> QTcpSocket tcpSocket = new QTcpSocket(this); Struct a{ int a1; int a2;} __attribute__((packed)); Struct b { int b1; int b2}__attribute__((packed)); Stru

我们是否可以将包含指向另一个结构的指针的结构,通过QTcpSocket套接字发送到在其他物理位置运行的程序的QTcpServer套接字,然后发送到该程序。我的代码将是这样的

<i>
QTcpSocket tcpSocket = new QTcpSocket(this);
Struct a{ int a1; int a2;} __attribute__((packed));

Struct b { int b1; int b2}__attribute__((packed));
Struct c{ a *c1; a*c2; }QByteArray block;

QDataStream out(&block, QIODevice::WriteOnly);
out << quint16(0)<<c;
out << quint16(block.size() - sizeof(quint16));
tcpSocket->write(block);
</i>

QTcpSocket tcpSocket=新的QTcpSocket(本);
结构a{inta1;inta2;}uuuu属性_uuu((压缩));
结构b{intb1;intb2}uuu属性_uu((压缩));
结构c{a*c1;a*c2;}QByteArray块;
QDataStream out(块和QIODevice::WriteOnly);

当然可以,但这没有多大意义。:-)如果该结构具有指针,则这些指针在远程主机上无效

当然,如果需要,还可以发送指针指向的内容

一个提示:如果您的程序是为了可移植性,请记住在传输之前将任何整数转换为网络字节顺序,然后再转换回主机字节顺序


.

您可以,只要接收方知道它不能只让发送进程取消对指针的引用。这意味着要与信息源进行沟通,并等待结果。这个过程被称为“对象代理”,并已在CORBA、COM+、jre等中实现


指针只能在已知的虚拟内存中进行解释。

除了前面所说的之外,您还可以使用类似于RPC系统的方法,该方法也会将这些指针指向的对象发送到堆中,但将它们保留在堆中,并相应地更改接收机器上的指针,这样你就能得到有效的指针。 要做到这一点而不出错当然不容易,只有在不可能改变观念的情况下,你才应该使用这种方法。

致以最诚挚的问候

您可以使用Qxt,它的网络模块中有一个RPC机制。您可以通过网络连接信号和插槽,并将任意类型的对象作为参数发送。你可以拿到它。

谢谢。你的意思是,在发送TCP数据包之后,发送机器也会发送实际数据给指针指向的人…?@anjali:可能,根据请求。要点是:接收者应该把“指针”当作自己无法解析的对象的句柄。谢谢。如果我没弄错的话,在发送的时候,实际数据流必须被发送给指针指向的人??在QTcpSocket中,我们附加任何对象,如QByteArray块;QDataStream out(块和QIODevice::WriteOnly);是的,没错。您已经覆盖了@anjali,我从未见过
属性((打包))
语法。它是一些C++扩展名吗?(属性(填充)),告诉GCC在成员之间删除所有填充。那在这件事上对你没有帮助。我认为你应该考虑Dariusz Scharsig所建议的,使用序列化。然后,转换任何整数。