gpt4 book ai didi

c++ - Boost - 在服务器关闭套接字上为新客户端 fork

转载 作者:太空狗 更新时间:2023-10-29 21:43:02 25 4
gpt4 key购买 nike

您好,我的线程中有这段代码:

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:

我创建了一张图片,以便您更好地理解我想要做什么:enter image description here

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com