【问题标题】:DLib - Why doesn't start_async() accept connections in a background thread?DLib - 为什么 start_async() 不接受后台线程中的连接?
【发布时间】:2016-11-08 19:47:50
【问题描述】:

这是我第一次尝试使用 DLib。我的目标是拥有一个可以同时与许多客户端线程连接的后台服务器。根据文档,start_async() 应该是dlib::server 的具体实现的方式,所以这就是我设置服务器的方式。

class TestServer : public dlib::server
{
    private:
        void on_connect(dlib::connection& c)
        {
            cout << "Hi." << endl;
        }

    public:
        void start_server()
        {
            set_listening_ip("127.0.0.1");
            set_listening_port(4790);

            start_async();
        }
};

下面是我的ServerMain.cpp

int main(int argc, char** argv)
{
    TestServer ts;

    try
    {
        ts.start_server();
    }
    catch(exception& e)
    {
        cerr << e.what() << endl;
    }

    return 0;
}

这是我的ClientMain.cpp

int main(int argc, char** argv)
{
    try
    {
        iosockstream stream("127.0.0.1:4790");

        cout << "CLIENT - Connected." << endl;
    }
    catch(exception& e)
    {
        cerr << e.what() << endl;
    }

    cout << "Done." << endl;

    return 0;
}

在启动我的服务器后,任何尝试使用客户端连接到它都会导致异常:

unable to connect to '127.0.0.1:4790'

此外,lsofnetstat 均未显示任何正在侦听端口 4790 的进程。 我做错了什么?

我在 Mac OS X 10.9.5 上,使用 -std=c++11 -DDLIB_NO_GUI_SUPPORT 编译。

【问题讨论】:

  • 赞成,因为您正在向我们展示代码并且似乎已尝试自行解决此问题。这并不是说不能添加额外的细节(比如什么操作系统等)......
  • @JesperJuhl 我将有关操作系统的详细信息放在最后一行。

标签: c++ sockets server client dlib


【解决方案1】:

直接来自 dlib::server 的 start_async() 文档

does NOT block.  That is, this function will return right away and
the server will run on a background thread until clear() or this
object's destructor is called (or until some kind of fatal error
occurs). 

所以你的服务器程序立即终止,因为你让程序结束(你离开 main())。你必须做一些事情来让你的程序保持活力。例如,调用服务器的 start() 而不是 start_async()。

【讨论】:

  • 我尝试使用start(),但它不会同时处理许多连接,而是按顺序处理。根据我对on_connect 方法的理解,它应该为每次连接尝试启动一个新线程,但事实并非如此。为什么?
  • 它确实同时处理许多连接。为什么你认为没有?
  • 我尝试在 on_connect 函数之后立即添加问候消息和 while(true);,然后我让 10 个客户端尝试与服务器建立连接。它们是按顺序提供的(奇怪的是,每次连接尝试都必须在前一次连接之前等待恰好 10 秒才能提供服务)。我希望问候消息会一个接一个地快速打印出来,但它没有发生。
  • 好吧。你以某种方式测试它是错误的。服务器绝对是多线程的。每个 on_connect 总是发生在一个单独的线程中。
  • Bash 通常不是多线程的。也许你不会一次产生多个。
猜你喜欢
  • 2013-05-21
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多