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

时间:2009-09-29 21:26:16

标签: c++ c sockets timeout pthreads

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

使用阻塞套接字的天真方法不起作用;偶尔,我会在'连接'中插入一个线程。我不能使用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向我展示它可能不是正确的方法,但我可能是错的。 ACE远远超过解决这个问题的重量。

4 个答案:

答案 0 :(得分:6)

你看过libevent吗?

http://www.monkey.org/~provos/libevent/

这是完全不同的范例,但表现非常惊人。

memcached建立在libevent之上。

答案 1 :(得分:5)

我看到了评论,我认为你可以使用boost :: asio和boost :: asio :: deadline_timer

代码片段:

    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_是boost :: asio :: deadline_timer 和MyClass类似于

    class Y: public enable_shared_from_this<Y>
    {
     public:

     shared_ptr<Y> f()
     {
       return shared_from_this();
     }
    }

您可以在连接读/写之前调用restart_timer

关于share_from_this()

的更多information

答案 2 :(得分:1)

你提到这种情况很偶然发生。您的“连接”端应该具有您正在寻找的容错和错误处理,但您还应该考虑服务器的稳定性,DNS,网络连接等。

底层协议非常坚固且工作得非常好,所以如果您遇到这类问题,那么通常可能值得检查。

答案 3 :(得分:0)

您也可以从其他线程关闭套接字。这应该导致连接失败。