У меня есть следующая проблема. Я хочу сделать несколько запросов на несколько «удаленных» серверов (на самом деле, мы контролируем ферму серверов). Соединение очень простое. Отправьте строку, а затем прочитайте строки назад. Из-за количества запросов и количества серверов я использую pthreads, по одному для каждого запроса.Простая библиотека ввода/вывода сети C/C++
Наивный подход, используя блокирующие сокеты, не работает; очень редко, у меня будет нить, застрявшая в «connect». Я не могу использовать 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 далеко, слишком тяжелый, чтобы решить эту проблему.
Почему Boost ASIO ошибочно подходит? Я согласен с ACE (и если он не был обновлен, чтобы использовать современные идиомы C++, я бы предпочел избежать этого на этой основе!). –
Я думаю, что Boost ASIO - неправильный подход, потому что он, похоже, не поддерживает таймауты при подключении или чтении/записи. Я ошибаюсь? Стандартный подход, похоже, заключается в использовании SIGALRM, который кажется неуместным, учитывая мое широкое использование pthreads. – ChrisInEdmonton
Вопрос о одном потоке на разъем в стороне, что случилось с pthread-kill()? – Duck