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