1

Stackoverflow コミュニティの皆様、こんにちは。

C++ を使用して UDP 転送を実装しようとすると、次の質問があります。

1) "/location 7 5" のような文字列を持つ単純な UDP パケットを受信し、浮動小数点値 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 );
4

2 に答える 2

0

現在のライブラリで引き続き問題が発生する場合は、BoostとASIOライブラリを確認することをお勧めします。

このページのUDPEchoServerの例は、始めるのに役立つ場合があります。

于 2013-03-13T04:45:09.460 に答える
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を参照してください。

于 2013-03-13T04:45:18.243 に答える