您好,我的线程中有这段代码:
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), serverPort));
r->serverRunning = true;
tcp::socket socket_(io_service);
io_service.run();
while(1)
{
if(boost::this_thread::interruption_requested())
{
acceptor.close();
}
acceptor.accept(socket_);
io_service.notify_fork(boost::asio::io_service::fork_prepare);
if (fork() == 0)
{
io_service.notify_fork(boost::asio::io_service::fork_child);
acceptor.close();
break;
}
else
{
io_service.notify_fork(boost::asio::io_service::fork_parent);
socket_.close();
continue;
}
}
sent something to client....
所以基本上我想接受一个新的连接并创建一个分支... child 将向客户端发送一些东西,而 parent 将接受下一个连接...
但是,当我在连接客户端后运行这段代码时,它会在短时间内发送一些信息,然后就会停止发送信息……知道为什么吗?
谢谢
编辑: 一段时间后,我尝试发送一些数据:
boost::asio::streambuf b;
std::ostream os(&b);
boost::system::error_code error;
for (;;)
{
try
{
std::string message = "";
bool empty = false;
r->command_mutex.lock();
empty = r->commands->empty();
if(!empty){
Command c;
c = r->commands->front();
r->commands->pop();
os << c;
size_t n = boost::asio::write(socket_, b, error);
b.consume(n);
}
r->command_mutex.unlock();
boost::this_thread::interruption_point();
}
catch(boost::thread_interrupted&)
{
std::cout << "Thread is stopped" << std::endl;
return;
}
}
正如您指出的,问题出在发送数据上,但我不知道为什么... 它不发送任何东西的原因是因为 r->commands 是空的,看起来它只包含 fork 之前队列中的数据,而 fork 之后添加的所有内容都不在该队列中..
所以 fork() 可能会复制 r 指向的结构?它“不再是指针”或它指向的位置已更改?
谢谢
编辑 2: 因此,发送是有效的,但在进程之间共享数据结构(如指针)是行不通的。解决办法可以boost inrerprocess但我认为更好的方法是线程...
编辑 3:
1.) 客户端连接到端点 2.) 服务器为每个客户端创建线程 3.) copy_thread 将相同的日期复制到每个客户端私有(private)队列 4.) clients_thread 向客户端发送数据
全局数据存储在 r-> 命令指针中,数据是通过多种方法动态收集的...我想将收集到的相同数据发送到所有客户端,直到我不会停止服务器线程 - 端点.. .
希望您能理解我正在尝试做的事情。谢谢
最佳答案
作为引用,这是一个仅发送大文件的自包含示例:
std::ifstream ifs("/etc/dictionaries-common/words");
std::string cpp(std::istreambuf_iterator<char>(ifs), {});
socket_.write_some(boost::asio::buffer(cpp));
它工作正常:
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <fstream>
using boost::asio::ip::tcp;
struct R {
bool serverRunning = false;
};
int main()
{
auto serverPort = 6767;
boost::asio::io_service io_service;
auto r = std::unique_ptr<R>(new R);
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), serverPort));
r->serverRunning = true;
tcp::socket socket_(io_service);
io_service.run();
while(1)
{
if(boost::this_thread::interruption_requested())
{
acceptor.close();
}
acceptor.accept(socket_);
io_service.notify_fork(boost::asio::io_service::fork_prepare);
if (fork() == 0)
{
io_service.notify_fork(boost::asio::io_service::fork_child);
acceptor.close();
std::ifstream ifs("/etc/dictionaries-common/words");
std::string cpp(std::istreambuf_iterator<char>(ifs), {});
socket_.write_some(boost::asio::buffer(cpp));
break;
}
else
{
io_service.notify_fork(boost::asio::io_service::fork_parent);
socket_.close();
continue;
}
}
}
当使用 netcat localhost 6767 检查时 | md5sum
,客户端每次都会收到文件的精确拷贝。
我认为你真正的问题不是 fork ,而是发送。
关于c++ - Boost - 在服务器关闭套接字上为新客户端 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23845501/