UDP数据包传输和C ++

时间:2013-03-13 04:19:59

标签: c++ udp

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 );

2 个答案:

答案 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