Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简单C/C++;网络I/O库_C++_C_Sockets_Timeout_Pthreads - Fatal编程技术网

C++ 简单C/C++;网络I/O库

C++ 简单C/C++;网络I/O库,c++,c,sockets,timeout,pthreads,C++,C,Sockets,Timeout,Pthreads,我有以下问题要解决。我想向多个“远程”服务器(实际上是我们控制的服务器场)发出多个请求。连接非常简单。发送一行,然后将行读回。由于请求的数量和服务器的数量,我使用pthread,每个请求一个 使用阻塞套接字的天真方法不起作用;偶尔,我会有一个线程卡在“连接”中。我不能使用SIGALRM,因为我正在使用pthreads。我尝试将代码转换为O_NONBLOCK,但这使读取单行代码变得非常复杂 我有什么选择?我正在寻找允许以下伪代码的最简单解决方案: // Inside a pthread try

我有以下问题要解决。我想向多个“远程”服务器(实际上是我们控制的服务器场)发出多个请求。连接非常简单。发送一行,然后将行读回。由于请求的数量和服务器的数量,我使用pthread,每个请求一个

使用阻塞套接字的天真方法不起作用;偶尔,我会有一个线程卡在“连接”中。我不能使用SIGALRM,因为我正在使用pthreads。我尝试将代码转换为O_NONBLOCK,但这使读取单行代码变得非常复杂

我有什么选择?我正在寻找允许以下伪代码的最简单解决方案:


// Inside a pthread
try {
    req = connect(host, port);
    req.writeln("request command");
    while (line = req.readline()) {
        // Process line
    }
} catch TimeoutError {
    // Bitch and complain
}

<我的代码在C++中,我使用Boost。快速浏览一下,我发现这可能不是正确的方法,但我可能错了。太重了,无法解决这个问题。

我看到了评论,我认为可以将boost::asio与boost::asio::deadline\u计时器一起使用

代码片段:

    void restart_timer()
    {
       timer_.cancel();
       timer_.expires_from_now(boost::posix_time::seconds(5));
       timer_.async_wait(boost::bind(&handleTimeout,
       MyClass::shared_from_this(), boost::asio::placeholders::error));
    }
handleTimeout是一个回调函数,
timer\u
是boost::asio::deadline\u timer MyClass与

    class Y: public enable_shared_from_this<Y>
    {
     public:

     shared_ptr<Y> f()
     {
       return shared_from_this();
     }
    }
Y类:公共启用\u共享\u
{
公众:
共享_ptr f()
{
从_this()返回共享的_;
}
}
在连接ou读/写之前,可以调用restart_timer


更多关于共享的信息,请参见本文()

我看到了这些评论,我认为您可以将boost::asio与boost::asio::deadline\u计时器一起使用

代码片段:

    void restart_timer()
    {
       timer_.cancel();
       timer_.expires_from_now(boost::posix_time::seconds(5));
       timer_.async_wait(boost::bind(&handleTimeout,
       MyClass::shared_from_this(), boost::asio::placeholders::error));
    }
handleTimeout是一个回调函数,
timer\u
是boost::asio::deadline\u timer MyClass与

    class Y: public enable_shared_from_this<Y>
    {
     public:

     shared_ptr<Y> f()
     {
       return shared_from_this();
     }
    }
Y类:公共启用\u共享\u
{
公众:
共享_ptr f()
{
从_this()返回共享的_;
}
}
在连接ou读/写之前,可以调用restart_timer


有关此()的
共享的更多信息
您看过libevent了吗

这是完全不同的模式,但性能是如此惊人


memcached构建在libevent之上。

您看过libevent吗

这是完全不同的模式,但性能是如此惊人


memcached构建在libevent之上。

您还可以从另一个线程关闭套接字。这将导致连接失败。

您也可以从另一个线程关闭套接字。这会导致连接失败。

您提到这种情况“非常偶尔”。你的“连接”端应该有你正在寻找的容错和错误处理,但是你也应该考虑服务器、DNS、网络连接等的稳定性。
底层协议非常坚固,工作也很好,因此,如果您经常遇到此类问题,那么可能值得检查。

您提到过这种情况“非常偶尔”。你的“连接”端应该有你正在寻找的容错和错误处理,但是你也应该考虑服务器、DNS、网络连接等的稳定性。
底层协议非常坚固且工作良好,因此,如果您经常遇到此类问题,那么可能值得检查。

为什么Boost ASIO是错误的方法?我同意ACE(除非它被更新为使用现代C++习语,我也宁愿在这个基础上避免它!)我认为Boost ASIO是错误的方法,因为它似乎不支持连接或读/写超时。我弄错了吗?标准方法似乎是使用SIGALRM,鉴于我对pthreads的广泛使用,这似乎不合适。撇开每个套接字一个线程的问题不谈,pthread-kill()有什么问题吗?Duck,这是个好问题。你是在建议我的主线程在执行pthread_连接时使用计时器,如果计时器过期,请杀死所有剩余的线程?那可能行得通。此外,您似乎建议不要对每个套接字使用一个线程。你认为Boost asio会让我很容易创建,比如说,十个套接字,然后异步读取每个套接字,而不必麻烦线程吗?与其说杀死它们,不如说发送一个sigusr,让它们脱离阻塞连接,让信号处理程序设置一个开关,这样当它们返回时,它们会自行清理。我没有使用boost asio,所以我不能直接对此发表评论,但如果你有很多关系来处理基本范式,那么你应该考虑在IMO中前进的方向。为什么boost asio是错误的方法?我同意ACE(除非它被更新为使用现代C++习语,我也宁愿在这个基础上避免它!)我认为Boost ASIO是错误的方法,因为它似乎不支持连接或读/写超时。我弄错了吗?标准方法似乎是使用SIGALRM,鉴于我对pthreads的广泛使用,这似乎不合适。撇开每个套接字一个线程的问题不谈,pthread-kill()有什么问题吗?Duck,这是个好问题。你是在建议我的主线程在执行pthread_连接时使用计时器,如果计时器过期,请杀死所有剩余的线程?那可能行得通。此外,您似乎建议不要对每个套接字使用一个线程。你认为Boost asio会让我很容易创建,比如说,十个套接字,然后异步读取每个套接字,而不必麻烦线程吗?与其说杀死它们,不如说发送一个sigusr,让它们脱离阻塞连接,让信号处理程序设置一个开关,这样当它们返回时,它们会自行清理。我没有使用boost asio,所以我不能直接对此发表评论,但如果你有很多关系来处理基本范式,那么你应该考虑在IMO中的发展方向。libevent是一个好主意,我现在将仔细阅读,看看它是否更适合我的需要。libevent是一个好主意,我现在要读一读,看看它是否更适合我的需要。我花了一些时间将我的代码转换为boost asio和I