Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;中断UDP侦听器。在Xcode中使用oscpack编译_C++_Sockets_Udp_Osc - Fatal编程技术网

C++ C++;中断UDP侦听器。在Xcode中使用oscpack编译

C++ C++;中断UDP侦听器。在Xcode中使用oscpack编译,c++,sockets,udp,osc,C++,Sockets,Udp,Osc,我已经成功地在我的应用程序中加入了一个udprective函数。然而!我不知道如何阻止UDP侦听器无限运行。OSCPack库内置了Break()和AsynchronousBreak(),但我一直无法实现这些 在oscpack中的udpSocket.cpp文件中: void Run() //the listener function (WORKING!) { break_ = false; //UDP Listener Code void Break() {

我已经成功地在我的应用程序中加入了一个udprective函数。然而!我不知道如何阻止UDP侦听器无限运行。OSCPack库内置了Break()和AsynchronousBreak(),但我一直无法实现这些

在oscpack中的udpSocket.cpp文件中:

void Run() //the listener function (WORKING!)
{
    break_ = false; 
    //UDP Listener Code

    void Break()
    {
        break_ = true;
    }
    void AsynchronousBreak()
    {
        break_ = true;
        // Send a termination message to the asynchronous break pipe, so select() will return
        write( breakPipe_[1], "!", 1 );
    }
}
我试图从数据包侦听器类调用Break()似乎没有任何作用,尽管编译器建议所有调用都正确:

SocketReceiveMultiplexer s;
s.Break();
我尝试过的另一种方法是根据rununtelsigint()函数发出中断标志。在数据包侦听器类中:

raise(SIGINT);
但这会终止整个程序,而不仅仅是脱离UDPListener。以下是udpSocket.cpp中的rununtlsigint()代码供参考:

void SocketReceiveMultiplexer::RunUntilSigInt()
{
    assert( multiplexerInstanceToAbortWithSigInt_ == 0 ); /* at present we support only one multiplexer instance running until sig int */
    multiplexerInstanceToAbortWithSigInt_ = this;
    signal( SIGINT, InterruptSignalHandler );
    impl_->Run();
    signal( SIGINT, SIG_DFL );
    multiplexerInstanceToAbortWithSigInt_ = 0;
}
我完全被这件事缠住了,任何帮助/建议都将不胜感激

谢谢,
汤姆

很抱歉问了一个愚蠢的问题:你有没有试着在休息前让听者听呢

SocketReceiveMultiplexer s;
s.Run(); // let wire up the things
s.Break();

我知道这是一个有点老的问题,但我最近不得不克服这个问题,并没有在网上找到一个好的答案。oscpack使用的模型似乎是,它们控制无限
运行
循环,您可以在从OscPacketListener派生的类中实现您想要执行的所有操作。如果不想这样做,则需要在单独的线程中运行
run
循环。在oscpack 1.1.0版本中,似乎不再有对线程的内部支持。他们在该版本的文件中解释说,您需要实现自己的线程解决方案。
SocketReceiveMultiplexer
中的
Run
例程永远不会返回,因此调用之后的任何代码都无法访问。各种
Break
例程用于控制来自不同线程的
Run
循环的执行。在下面的示例中,我使用的是c++11
,但是您可以使用您选择的任何线程库来完成类似的任务。在我的例子中,你必须

#include <threads>
#include <mutex>
在代码的其他地方,打一个类似

std::thread lt(ListnerThread);
以启动侦听器运行。您必须创建一些在主线程和侦听器线程之间共享信息的方法。一个简单的方法是使用一个由互斥体(也是全局的)包围的全局变量。当然还有其他(更好的?)方法,但这很容易。全局声明这些值(按照其示例),而不是在
ProcessMessage
函数中声明:

std::mutex oscMutex;

bool a1;
osc::int32 a2;
float a3;
const char *a4;
ExamplePacketListener
中,他们从
args
流中设置变量,然后调用
cout
,您可以执行以下操作

oscMutex.lock();
args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage;
oscMutex.unlock();

只要确保在代码中其他地方访问这些变量时,以相同的方式对互斥锁进行
lock()
unlock()。万一有人需要石油

当我使用
rununtilsignt()
函数运行侦听器时,使用
raise(SIGINT)
可以为我提供技巧。这是一个快速破解,虽然很难看,但它是这样的:

        if (std::strcmp(m.AddressPattern(), "/test1") == 0) {

            osc::ReceivedMessageArgumentStream args = m.ArgumentStream();

            osc::int32 a1, a2, a3;
            const char *a4;
            args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage;

            raise(SIGINT);
        }

在这种情况下,当我收到一个包时,我会停止侦听器,但您可以根据需要修改它。

你好,Yuri,是的,侦听器是从我的主程序运行的()。正如我上面提到的,代码运行得非常完美。。。除了这个事实,我不能脱离听众,继续做其他的事情!!!谢谢,汤姆。在本地发送一个“停止”数据报吗?@MartinJames,谢谢你,像这样的?马特,谢谢你的指点!我认为它需要在不同的线程中运行,但无法在iOS中实现。我将在2015年再次参与这个项目,所以我将有时间尝试你的方法。干杯,汤姆。你好。由于我有自己的主循环,是否有其他方法将osc::UdpSocket::ReceiveFrom()合并到我的主循环中?
        if (std::strcmp(m.AddressPattern(), "/test1") == 0) {

            osc::ReceivedMessageArgumentStream args = m.ArgumentStream();

            osc::int32 a1, a2, a3;
            const char *a4;
            args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage;

            raise(SIGINT);
        }