Конференция Sun Microsystems
Сегодня с Динамиком были на конференции Sun, посвященной ее новым серверам, процам и др. Так же там выступил представитель AMD, который рассказал об их новых 4-хядерных процессорах Barcelone и полностью опустил Intel))
P.S. Ах, да!!! Фуршет был просто великолепен!
День Рождения Ёжига!!!!!!!!
Всё началось с того, что я проспал))))))) Разбудила меня Яночка с криками “Ты где, ^@#&$!!!”
Я, прыгая на одной ноге и пытаясь засунуть с другую в джинсы, стал запихивать lappy в рюкзак. Потом забежал в ванну и съел немного зубной пасты в надежде, что это прокатит за чистку зубов! Бегу к яниному дому. Звоню Яне. Мобила виснет! %@^$#@!!!! Бегу на остановку, садимся, едем к Ежигу. Ффуу…
Мы с Sky Smile и Still подарили ему вайфайную карту для lappy DWL-G650, а еще ему подарили комп для вела и др.
Оказывается двоюродная сестра м брат Ежига учились со мной в одной школе! И они даже помнят меня!! Жесть)))
Познакомился с двумя друзьями Ежига – Андреем и Максом. Аще жгут чуваки.
Потом мы поехали в Максу на дачу и там жгли до 19 часов где-то.
А потом мы со Still и Ezhik поехали ко мне тестить подарок))) и гамацца в Prince of Persia: The Two Thrones.
Вот так мы седня отжигали)
Утро в универе, дела и прога
Спал седня 3 часа. Встал в 6:30. Аще пофиг! Выспался как собако! Крута!
Поехал в универ сдавать базы данных. Надо было сдать и защитить 4-ю лабу (DAO). Надо сказать, что эту лабу я вчера сделал в полвторого ночи левой пяткой правой ноги. Но там все было прально!
Короче, поставили мне защиту фактически даром. Потом еще веселее….У девченок из параллельной группы не заработала лаба по Системному ПО. Подходит препод – лаба все равно не работает….Зовут меня. Я смотрю в прогу. Туплю. Еще раз смотрю. Потом вижу, что они в ф-ю вместо переменной пихают указатель на нее…Думаю, мдя…..
Потом еще Динамику помого лабу сделать.
Потом кто-то в 10-й раз задал мне один и тот же вопрос. Я обиделся. Поорал малость)
Дальше я хотел пойди все-таки сдать зачод по биде. Людмила Васильевна Тюнина поставила мне автомат и послала гулять!))) кааайф)
Поехал по делам с братом. Потом мы с ним посидели в NYP. Я постал мессагу на твиттер. А потом мы разъехались по домам!
Дома я засел за баку и дописал таки асинхронного параллельного клиента с использованием библиотеки boost.asio на с++.
Вот код:
/* * Asyncronous concurrent HTTP client * Author: VLadislav Chernyshov * */// Copyright (c) 2003-2007 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#define PROC_SPEED 2394021669 /* uint64_t t3 = rdtsc(); sleep(100); uint64_t t4 = rdtsc(); */ #include <iostream> #include <istream> #include <ostream> #include <string> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/thread.hpp> #include <unistd.h> #include <stdint.h> extern __inline__ uint64_t rdtsc() { uint64_t x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; } uint64_t t1; uint64_t t2; using boost::asio::ip::tcp; class client { public: client(boost::asio::io_service& io_service, const std::string& server, const std::string& path) : resolver_(io_service), socket_(io_service), strand_(io_service) { start = rdtsc(); _server = server; // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. std::ostream request_stream(&request_); request_stream << "GET " << path << " HTTP/1.0\r\n"; request_stream << "Host: " << server << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Start an asynchronous resolve to translate the server and service names // into a list of endpoints. tcp::resolver::query query(server, "http"); resolver_.async_resolve(query, boost::bind(&client::handle_resolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); } private: void handle_resolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) { if (!err) { // Attempt a connection to the first endpoint in the list. Each endpoint // will be tried until we successfully establish a connection. tcp::endpoint endpoint = *endpoint_iterator; socket_.async_connect(endpoint, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error, ++endpoint_iterator)); } else { std::cout << "Error: " << err.message() << "\n"; } } void handle_connect(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) { if (!err) { // The connection was successful. Send the request. boost::asio::async_write(socket_, request_, boost::bind(&client::handle_write_request, this, boost::asio::placeholders::error)); } else if (endpoint_iterator != tcp::resolver::iterator()) { // The connection failed. Try the next endpoint in the list. socket_.close(); tcp::endpoint endpoint = *endpoint_iterator; socket_.async_connect(endpoint, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error, ++endpoint_iterator)); } else { std::cout << "Error: " << err << "\n"; } } void handle_write_request(const boost::system::error_code& err) { if(_server == "217.71.139.77") sleep(rand()%5); if (!err) { // Read the response status line. boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::handle_read_status_line, this, boost::asio::placeholders::error)); } else { std::cout << "Error: " << err << "\n"; } } void handle_read_status_line(const boost::system::error_code& err) { if (!err) { // Check that response is OK. std::istream response_stream(&response_); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return; } if (status_code != 200) { std::cout << "Response returned with status code "; std::cout << status_code << "\n"; return; } // Read the response headers, which are terminated by a blank line. boost::asio::async_read_until(socket_, response_, "\r\n\r\n", boost::bind(&client::handle_read_headers, this, boost::asio::placeholders::error)); } else { std::cout << "Error: " << err << "\n"; } } void handle_read_headers(const boost::system::error_code& err) { if (!err) { // Process the response headers. std::istream response_stream(&response_); std::string header; // while (std::getline(response_stream, header) && header != "\r") // std::cout << header << "\n"; // std::cout << "\n"; // Write whatever content we already have to output. if (response_.size() > 0) // std::cout << &response_; // Start reading remaining data until EOF. boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&client::handle_read_content, this, boost::asio::placeholders::error)); } else { std::cout << "Error: " << err << "\n"; } } void handle_read_content(const boost::system::error_code& err) { if (!err) { // Write all of the data that has been read so far. // std::cout << &response_; // Continue reading remaining data until EOF. boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&client::handle_read_content, this, boost::asio::placeholders::error)); } else if (err != boost::asio::error::eof) { std::cout << "Error: " << err << "\n"; } end = rdtsc(); std::cout << "Request time for " << _server << ": "<<double(end-start)/PROC_SPEED << std::endl; } std::string _server; uint64_t start; uint64_t end; boost::asio::strand strand_; tcp::resolver resolver_; tcp::socket socket_; boost::asio::streambuf request_; boost::asio::streambuf response_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: async_client <server> <path>\n"; std::cout << "Example:\n"; std::cout << " async_client 217.71.139.228 /\n"; return 1; } int n = 0; std::cin >> n; t1 = rdtsc(); boost::asio::io_service io_service; client** c = new client*[n]; for(int i = 0; i < n; i++) c[i] = new client(io_service, (rand()%5 - 2 > 0)?"217.71.139.228":"217.71.139.77", "/sensor.xml"); boost::thread** tr = new boost::thread*[n]; for(int i = 0; i < n; i++) tr[i] = new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service)); for(int i = 0; i < n; i++) tr[i]->join(); t2 = rdtsc(); delete c; delete tr; std::cout << "Total time: "<< double(t2-t1)/PROC_SPEED << std::endl; } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; }
Оно даже работает) Ответы обрабатываются асинхронно, т.е. если какой-то сервер долго не отвечает, это не парализовывает работу программы в целом. Конечно, производительность меньше, чем если писать на POSIX threads и sockets, однако boost.asio позволяет писать асинхронные, event-driven программы, обладающие хорошей переносимостью (Linux, Unix, QNX, Windows).
By the way, I should perform some test on this program under QNX.
boost.asio заработало
Заставил таки работать boost.asio! Тока не понятно, будут ли асинхронные клиенты работать параллельно:
boost::asio::io_service io_service;
client c(io_service, argv[1], argv[2]);
client c1(io_service, argv[1], argv[2]);
boost::thread tr1(boost::bind(&boost::asio::io_service::run, &io_service));
io_service.run();
tr1.join();
Я написал в Boost mailing list. Посмотрим, че ответят)
Ы….пошел я спать…Завтра пойду сдавать биде.
Творческий кризис) хаха
Седня весь день сидели с Динамиком в универе писали баки….Аще жесть. Так ничего толком и не написали….Асинхронные сокеты не пишутся, IPDSLAM глючит. Убунту 7.04 и Мандрива 2007 тоже))))
Часов в 19 забили и ушли домой.
P.S. Есть кое-какие идеи, как сделать asyncronous network I/O со временем опроса < 1 мс, но это в понедельник.








