Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / from asio::tcp::socket to std::stream / 10 сообщений из 10, страница 1 из 1
22.02.2013, 19:42
    #38162795
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
Добрый день!

Есть у меня программа, которая работает с файламы, функции принимают ostream& или istream&, пишет в файл
( save_request(std::ostream & out) ) или из файла ( request_data_deserialize (istream& in_data) ).

Теперь задача, что бы ф-ция писала/читала в/из socket!!

Как можно передать socket_stream, я что то не могу разобраться..

Спасибо.

С Уважением.
...
Рейтинг: 0 / 0
23.02.2013, 05:58
    #38163076
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
bdm77,
Вот пример который создает сокет-поток к сайту яндекса и потом отправляет запрос и читает ответ (только HTTP заголовки) двумя функциям, которые про сокеты ничего не знают, а работают с std::istream и std::ostream
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
void save(std::ostream& os)
{
    os << "GET / HTTP/1.1\r\n"
       << "Host: ya.ru\r\n"
       << "\r\n";
}

std::string retrieve(std::istream& is)
{
    std::string out;
    std::string line;
    while (getline(is, line))
    {
        if (line == "\r") // stop at header end
            break;
        out += line;
        out += "\n";
    }
    return out;
}

int main()
{
    boost::asio::io_service ais;
    boost::asio::ip::tcp::iostream sock_stream("ya.ru", "80");
    
    save(sock_stream);
    sock_stream.flush();
    cout << "Request sent" << endl;
    
    string response = retrieve(sock_stream);
    cout << "Response received:" << endl;
    cout << response << endl;
    return 0;
}
...
Рейтинг: 0 / 0
23.02.2013, 10:22
    #38163108
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
Anatoly Moskovsky,

спасибо
...
Рейтинг: 0 / 0
23.02.2013, 20:04
    #38163315
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
bdm77,

Можно еще с помощью Boost.iostreams написать обертку непосредственно над tcp::socket (или над вообще любым АПИ) - это если у вас архитектура не позволяет использовать tcp::iostream в качестве сокета.

Такая обертка - строк 10 кода. Если есть необходимость могу привести пример.
...
Рейтинг: 0 / 0
24.02.2013, 18:01
    #38163817
from asio::tcp::socket to std::stream
Anatoly Moskovskybdm77,

Можно еще с помощью Boost.iostreams написать обертку непосредственно над tcp::socket (или над вообще любым АПИ) - это если у вас архитектура не позволяет использовать tcp::iostream в качестве сокета.

Такая обертка - строк 10 кода. Если есть необходимость могу привести пример.
А откуда может в архитектуре возникнуть такая необходимость, писать с помощью Boost.iostreams вместо tcp::iostream?
...
Рейтинг: 0 / 0
24.02.2013, 18:36
    #38163838
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
необходимость,

Например если в приложении используется чужая библиотека которая допустим на выходе выдает tcp::socket.
А из готового tcp::socket нельзя создать tcp::iostream.
...
Рейтинг: 0 / 0
24.02.2013, 22:16
    #38163933
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
Anatoly Moskovsky,

Буду Вам признателен, если приведете пример..

Спасибо.
...
Рейтинг: 0 / 0
25.02.2013, 00:28
    #38164013
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
bdm77,

Ну вот пример с tcp::socket + boost.iostreams

Код функций save и retrieve не привожу. Он не изменился - см. выше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
class sock_iostream_device
{
public:
    typedef char char_type;
    struct category
            : public virtual boost::iostreams::seekable_device_tag
    {};

    sock_iostream_device(boost::asio::ip::tcp::socket& sock)
        : m_sock(sock)
    {
    }

    std::streamsize read(char* buffer, std::streamsize n)
    {

        boost::system::error_code ec;
        std::streamsize len = m_sock.receive(boost::asio::buffer(buffer, n), 0, ec);
        if (ec)
            len = 0;
        return len;
    }

    std::streamsize write(const char* buffer, std::streamsize n)
    {

        boost::system::error_code ec;
        std::streamsize len = m_sock.send(boost::asio::buffer(buffer, n), 0, ec);
        if (ec)
            len = 0;
        return len;
    }

    std::streamsize seek(std::streamsize off, std::ios_base::seekdir way)
    {
        // not supported
        return 0;
    }

private:
    boost::asio::ip::tcp::socket& m_sock;
};

typedef boost::iostreams::stream< sock_iostream_device > sock_iostream;

int main()
{
    boost::asio::io_service ais;
    boost::asio::ip::tcp::socket sock(ais);
    boost::asio::ip::tcp::resolver resolver(ais);
    boost::asio::ip::tcp::endpoint server = *resolver.resolve(boost::asio::ip::tcp::resolver::query("ya.ru", "80"));
    sock.connect(server);

    sock_iostream sock_stream(sock);

    save(sock_stream);
    sock_stream.flush();
    cout << "Request sent" << endl;
    string response = retrieve(sock_stream);
    cout << "Response received:" << endl;
    cout << response << endl;
    return 0;
}
...
Рейтинг: 0 / 0
25.02.2013, 00:30
    #38164014
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
А, забыл привести хедеры:
Код: plaintext
1.
2.
3.
4.
5.
#include <boost/asio.hpp>
#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/positioning.hpp>
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/stream.hpp>
...
Рейтинг: 0 / 0
25.02.2013, 01:32
    #38164052
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
from asio::tcp::socket to std::stream
Anatoly Moskovsky,

Огромное спасибо..
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / from asio::tcp::socket to std::stream / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]