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

标签 c++ sockets boost boost-asio

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

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/

相关文章:

c++ - 如何让一个方法访问其他模板类实例的私有(private)成员?

c - 如何用C语言简单地发送UDP数据?

c++ - boost 线程代码 ~uintmax_t(0)

c++ - MongoDB C++ JSON 解析

c++ - 如何序列化共享/弱指针?

c# - 如何在 Web 应用程序中使用 native 库方法?

c++ - 使用 Ubuntu 在 C/C++ 中的 UDP 套接字发送限制

C - 为什么我不能从本地主机外部访问我的服务器?

C++ 使用带有 boost::lexical_cast 的类

c++ - 添加 #include <boost/thread/mutex.hpp> 会破坏我的 ActiveX 控件吗?