我在尝试使用c ++关闭服务器套接字时遇到问题。 当我启动我的应用程序时,我有我的主线程,我创建另一个配置,绑定和接受连接。
我的问题来自于我无法从另一个线程关闭套接字fd而不是创建fd的线程。
我尝试创建如下循环:
while (!_stopRequested) {
client_session = accept(_session, reinterpret_cast<socket_t *>(&client_insocket), &clientsocksize);
if (client_session == SOCKET_ERROR) {
fprintf(stderr, "Socket accept error\n");
continue;
}
printf("TODO clients holding, data serialization");
}
当我想退出循环然后关闭套接字但是它没有任何效果时, _ stopRequested
从主线程设置为true。
这是因为循环在accept
上阻塞了。有没有办法让accept
无阻塞一次?然后循环将按预期打破,我将能够从持有循环的线程中关闭套接字。
潜在解决方案
我正准备在服务器套接字线程上处理SIGINT。
通过调用pthread_kill(ssocket_thread, SIGINT)
,我应该从处理程序关闭服务器套接字,然后pthread_terminate()
。但这种方式需要制作一个静态变量和静态函数,我想知道是否存在更简单的解决方案..