使用C ++

时间:2019-01-22 23:26:52

标签: c++ multithreading udpclient

由于我致力于开发一些小的音频应用程序,这些应用程序通过UDP协议在网络上共享音频内容,因此我目前正在为UDP Client类起草代码。
提到的此类应接收连接到网络的其他客户端的音频内容,并发送在本地计算机上处​​理的音频内容。所有这些内容都与作为内容路由器的服务器交换。
由于音频内容是由音频应用程序定期调用的process()方法生成的,因此为了不丢失数据包,每个音频应用程序应具有一种与process()方法无关的UDP侦听器那应该总是活跃的;它们应该只共享一个缓冲区或内存分配,在其中可以临时保存音频数据并在以后进行处理。

考虑到所有这些,我对这种方法进行了编码:

void udp_client::listen_to_packets() {
    while (udp_client::is_listening) {
        if ((udp_client::message_len = recvfrom(udp_client::socket_file_descr, udp_client::buffer, _BUFFER_SIZE, MSG_WAITALL, (struct sockaddr*) &(udp_client::client_struct), &(udp_client::address_len))) < 0) {
            throw udp_client_exception("Error on receiving message.");
        }
        std::cout << "New message received!" << std::endl;
    }
    std::cout << "Stop listenig for messages!" << std::endl;
}

如您所见,该函数使用udp_client::buffer,这是我之前提到的共享内存分配。为了使其始终处于活动状态,我正在考虑在类构造时启动一个新线程或进程,并在类破坏时停止其执行:

udp_client::udp_client():
  is_listening(true)  {
  std::cout << "Constructing udp_client..." << std::endl;
  std::thread listener = std::thread(udp_client::listen_to_packets);
}

udp_client::~udp_client() {
  std::cout << "Destructing udp_client..." << std::endl;
  udp_client::is_listening = false;
}

当然,上面列出的代码不起作用,按照@ user4581301的建议,listeneris_listening变量定义已移至类属性:

private:
  std::atomic<bool> is_listening;
  std::thread listener;

此外,对构造函数和析构函数进行了一些修改:

udp_client::udp_client():
  listener(&udp_client::listen_to_packets, this),
  is_listening(true)  {
  std::cout << "Constructing udp_client..." << std::endl;
}

udp_client::~udp_client() {
  std::cout << "Destructing udp_client..." << std::endl;
  udp_client::is_listening = false;
  listener.join();
}

不幸的是,g++仍然返回错误,表明std::thread类没有带有两个参数的构造函数:

  错误:没有匹配的构造函数,用于初始化“ std :: thread”     监听器(&udp_client :: listen_to_packets,此)

那么,我该怎么修改才能使代码正常工作?

在这里您可以看到该类的实现(希望此链接允许Stack Overflow规则使用):
https://www.dropbox.com/sh/lzxlp3tyvoncvxo/AAApN5KLf3YAsOD0PV7wJJO4a?dl=0

0 个答案:

没有答案