我有以下问题需要解决。我想向许多“远程”服务器(实际上是我们控制的服务器场)发出大量请求。连接非常简单。发送一行,然后读回去的行。由于请求数量和服务器数量,我使用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远远超过解决这个问题的重量。
答案 0 :(得分:6)
答案 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()
答案 2 :(得分:1)
你提到这种情况很偶然发生。您的“连接”端应该具有您正在寻找的容错和错误处理,但您还应该考虑服务器的稳定性,DNS,网络连接等。
底层协议非常坚固且工作得非常好,所以如果您遇到这类问题,那么通常可能值得检查。
答案 3 :(得分:0)
您也可以从其他线程关闭套接字。这应该导致连接失败。