gpt4 book ai didi

c++ - UDP 数据包传输和 C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:29 25 4
gpt4 key购买 nike

你好 Stackoverflow 社区,

在尝试使用 C++ 实现 UDP 传输时,我有以下问题:

1) 我正在尝试构建一个函数,该函数将接收一个简单的 UDP 数据包,其中包含一个类似“/location 7 5”的字符串,并解析出浮点值 7 和 5 并将其存储到一个数组中。有没有关于如何执行此操作的示例?

2) 在尝试使用来自 https://code.google.com/p/oscpack/ 的 OSCPacket 之后几个小时,但我无法克服此处显示的任何编译器错误:http://i.tylian.net/untitloxo.png

如错误消息所示,错误来自 OSCPack 而不是我的代码。有没有人熟悉这个或者有更好的方法来实现 UDP 数据包传输?

3) 我只使用 ws32.dll 库,但除此之外还有我应该使用的其他库吗?

请随时回答部分或全部多部分问题,如果需要更多详细信息,请告诉我!另外,我的目标平台是 Windows 7 64 位。

非常感谢您的宝贵时间!

以下是我使用 OSCPacket 完成的一些代码:

包括:

#include <iostream>
#include <cstring>

#if defined(__BORLANDC__) // workaround for BCB4 release build intrinsics bug
namespace std {using ::__strcmp__; } // avoid error: E2316 '__strcmp__' is not a member of 'std'.
#endif

#include "osc/OscReceivedElements.h"
#include "osc/OscPacketListener.h"
#include "ip/UdpSocket.h"

#define PORT 7000

数据包监听器

float* coordinateFromOSC = (float*) malloc (2);
class PacketListener : public osc::OscPacketListener {
protected:

virtual void ProcessMessage( const osc::ReceivedMessage& m,
const IpEndpointName& remoteEndpoint )
{
(void) remoteEndpoint; // suppress unused parameter warning

try{
//the return value, array of 2, [0] for xValue, [1] for yValue
//will be stored at global variable coordinateFromOSC

// Trying to parse the packet. osc::OsckPacketListener
if( strcmp( m.AddressPattern(), "/location" ) == 0 ){
// Streaming input as argument
osc::ReceivedMessageArgumentStream args = m.ArgumentStream();
float xValue, yValue;
args >> xValue >> yValue >> osc::EndMessage;

coordinateFromOSC[0] = xValue;
coordinateFromOSC[1] = yValue;
}

}catch( osc::Exception& e ){
// any parsing errors such as unexpected argument types, or
// missing arguments get thrown as exceptions.
std::cout << "Invalid format: "
<< m.AddressPattern() << ": " << e.what() << "\n";
}
}
};

最后在我需要存储值的函数中

PacketListener listener;
UdpListeningReceiveSocket s(IpEndpointName( IpEndpointName::ANY_ADDRESS, PORT ), &listener );

最佳答案

要在 C++ 中解析字符串,请尝试使用流运算符(另外:您的输入实际上需要是字符串吗?):

std::string str("/location 7 5");
std::stringstream ss(str);
std::string cmd;
float x, y;
ss >> cmd >> x >> y;

对于 OSCPacket,您可能没有正确设置项目设置。为什么不直接使用 Winsock?

有关使用 Winsock 的示例,请参阅 http://www.adp-gmbh.ch/win/misc/sockets.html

关于c++ - UDP 数据包传输和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15377014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com