使用 C++ 和 Qt 通过 UDP 发送 float var

     2023-02-16     206

关键词:

【中文标题】使用 C++ 和 Qt 通过 UDP 发送 float var【英文标题】:Send float var via UDP with C++ and Qt 【发布时间】:2015-03-31 11:24:16 【问题描述】:

你好,你可以看到我是新来的(在 C++ 和 Qt 中)。

请帮助我,我想通过 UDP 将一些命令从我的应用程序发送到 X-Plane(飞行模拟器)。简而言之,我需要这样发送消息:

DREF0XXXXsim/joystick/yoke_roll_ratio

其中 XXXX 是四个字节的浮点值。 问题是,当我发送像 0 或 0.5 这样的浮点值时,在这些值中,一些字节为 0(?)并且 c++ 认为这是消息的结尾。

我使用 memcpy 将浮点值更改为 4 个字节(字符),但如果其中一些是 0 我的消息结束。

其他值(例如 0.1、0.2 等)都可以。我发现我可以将零更改为例如1 但在这种情况下,当我发送 0.5 值时,我收到 0.50392(当我发送 0.4 时,我收到 0.4000000)。

我使用 Qt 库和这个函数来发送数据:

socket->writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)

问题是 - 如何发送零字节或浮点值,如 0.5 或 0?

【问题讨论】:

【参考方案1】:

我使用 memcpy 将浮点值更改为 4 个字节(字符),但如果其中一些是 0,我的消息结束。

不,你没有。 memcpy 复制内存,在您的情况下,构成浮点数的 4 字节。您不必这样做,只需在 writeDatagram 之类的地方使用该内存:

writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)

是signature,所以你可以直接调用

writeDatagram(reinterpret_cast<const char*>(myfloat_pointer), 4, ....)

UDP 和 Qt 真的不关心数据中的内容,所以你的 0 字节问题来自其他东西——我怀疑你的 memcpy 机制;您是否有机会使用strlen 或其他东西来确定要复制多少内存?

【讨论】:

【参考方案2】:

这个

reinterpret_cast<const char*>(myfloat_pointer)

解决了这个问题。我更改了我的代码,现在它可以工作了:

char strToSend[509] = "DREF0";
char c[4];
char *cp = &c[0];
cp = reinterpret_cast<char*>(&pitchValue);
memcpy(&strToSend[5], &cp[0], 4);
std::string dref = "sim/joystick/yoke_pitch_ratio";
memcpy(&strToSend[9], dref.data(), dref.size());
socket->writeDatagram(&strToSend[0], 509, host, 49000);

我不确定这是一个好/漂亮的代码,但它可以工作 - X-Plane 接收正确的数据。

【讨论】:

在 C++ 中通过 UDP 发送字符串

...我已经多次通过Java的UDP和TCP完成此操作,但现在我必须使用标准C++库来完成此操作,而且我找不到任何示例主题,只有人们无法使其工作。我知道我必须 查看详情

使用winsock vc++通过UDP发送数字数组

】使用winsockvc++通过UDP发送数字数组【英文标题】:SendingnumericArrayviaUDPusingwinsockvc++【发布时间】:2014-07-2215:44:59【问题描述】:已解决:问题主要在于正在读取UDP数据包而不是数据传输的simulink模块集。我正在尝试使用winsock从C+... 查看详情

套接字编程:在 UDP 上发送数据包(C++)

...(具有标头和数据数组)。我处于初步阶段,在消息中不使用任何数据,并且我想发送此标头,它由结构的结构和嵌套的枚举表示。除了序列化所述结构然后构造缓冲区数据并发送它们之外,还有其他方法可以在UDP上发送数据 查看详情

在 C++ 中通过 UDP 发送缓冲图像

...区中。现在我想通过UDP数据包发送这个缓冲区。我对如何使用感到困惑套接字中的sendto()函数。感谢您提供的任何帮助。IStream*pStream=NULL;LARGE_INTEGERliZero=;U 查看详情

qt学习笔记(13)qt下的udp通信

...来数据,套接字自动触发readyRead()方法  套接字QUdpSOcket通过readDatagram()和writeDatagram()方法读取和写入数 查看详情

C++ UDP客户端/套接字编程:不能发送和接收

...大学考试。我想发送移动坐标并接收测试字符。但是当我使用recvfrom()时它不起作用,没有它就可以正常工作。对不起我的英语。这是客 查看详情

c++ 打孔UDP(RTP)

...端-服务器语音聊天程序(非托管C++,win32),其中客户端使用TCP连接到服务器,文本聊天/聊天室功能在TCP中完成,而所有音频传输都通过单独的UDP/RTP套接字发送(使用来自JRTPLIB的API)。所以从TCP连接知道IP,建立连接后就可以... 查看详情

是否有使用 python asyncio 绑定的 C++ 的可靠 UDP 实现? [关闭]

】是否有使用pythonasyncio绑定的C++的可靠UDP实现?[关闭]【英文标题】:IsthereReliableUDPimplementationforC++withpythonasynciobindings?[closed]【发布时间】:2017-03-0109:49:14【问题描述】:我需要在对等点之间发送和接收可靠的数据报(通过使用... 查看详情

使用 UDP 协议和 writeDatagram 发送结构体

】使用UDP协议和writeDatagram发送结构体【英文标题】:SendastructurewithUDPprotocolandwriteDatagram【发布时间】:2014-08-0103:49:25【问题描述】:我的目标是通过UDP协议发送一个结构,我的问题是我用来做它的函数与他参数中的结构不兼容... 查看详情

qt下udp套接字通信——qudpsocket简单使用(代码片段)

...数据报、无连接的协议。它可以在可靠性不重要的情况下使用。QUdpSocket是QAbstractSocket的一个子类,允许您发送和接收UDP数据报。注意:使用时需要在pro文件中添加network组件QT+=network例子效果展示代码发送端.h#ifnd 查看详情

UDP C++接收

...++receive【发布时间】:2018-03-0106:30:00【问题描述】:我想通过UDP从设备发送/接收数据。该设备充当服务器,如果我向它发送一个值,它会向我发送一些值。首先我写了一个没有任何问题的python代码:importsocketimporttimeUDP_IP="192.168.... 查看详情

想要使用 c++ 或 perl 使用 OpenSSH 和 SFTP 通过 Internet 发送文件---Windows Vista 两者

】想要使用c++或perl使用OpenSSH和SFTP通过Internet发送文件---WindowsVista两者【英文标题】:Wanttousec++orperltosendafileovertheinternetusingOpenSSHandSFTP---WindowsVistaboth【发布时间】:2011-11-2214:52:12【问题描述】:我想使用c++或perl通过OpenSSH和SFTP通... 查看详情

将字节数组从java程序发送到c++

...ava创建了一个非常简单的客户端和服务器程序,并且能够使用Java类DatagramSocket和DatagramPacket在两个Java客户 查看详情

如何在 Qt 中进行 UDP 打孔?

...:你知道,这真的,真的复杂。只是为了确保:您想通过使用您的服务器在同一程序的两个实例(在不同的客户端上运行)之间打一个洞?【参考方案1】:您必须 查看详情

通过 UDP 的 C++ 类在 C# 中使用,都有哪些选项?

】通过UDP的C++类在C#中使用,都有哪些选项?【英文标题】:C++classviaUDPtobeusedinC#,whataretheoptions?通过UDP的C++类在C#中使用,有哪些选项?【发布时间】:2017-09-0510:07:36【问题描述】:我正在通过UDP从C/C++应用程序接收数据。此应用... 查看详情

使用 boost::asio 通过 UDP 发送结构

】使用boost::asio通过UDP发送结构【英文标题】:SendingstructureoverUDPusingboost::asio【发布时间】:2019-11-0411:31:55【问题描述】:我需要通过UDP一次发送不同数据类型的结构。我曾尝试使用boost库,但我无法一次发送所有结构元素。这... 查看详情

如何使用 Perl 通过 TCP 和 UDP 连接到远程机器?

】如何使用Perl通过TCP和UDP连接到远程机器?【英文标题】:HowcanIconnecttoaremotemachineviaTCPandUDPwithPerl?【发布时间】:2009-11-2108:36:12【问题描述】:我有一个在服务器上运行的脚本,我现在希望它向我的PC发送消息。我想向某个端口... 查看详情

如何使用twisted通过UDP协议发送参数

】如何使用twisted通过UDP协议发送参数【英文标题】:HowtosendtheparameterwithUDPprotocolusingtwisted【发布时间】:2012-12-2317:15:03【问题描述】:如何使用twisted连接到以下url并从跟踪器获取响应。udp://tracker.publicbt.com:80/announce?uploaded=0&d... 查看详情