Hello 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 );
答案 0 :(得分:0)
如果您的当前库仍然存在问题,您可能需要查看Boost和ASIO库。
此页面UDP Echo Server Example可能会帮助您入门。
答案 1 :(得分:0)
要解析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