由于我致力于开发一些小的音频应用程序,这些应用程序通过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的建议,listener
和is_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