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

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

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

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

Спасибо.

С Уважением.
...
Рейтинг: 0 / 0
from asio::tcp::socket to std::stream
    #38163076
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
from asio::tcp::socket to std::stream
    #38163108
bdm77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

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

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

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

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

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
from asio::tcp::socket to std::stream
    #38164013
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
from asio::tcp::socket to std::stream
    #38164014
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, забыл привести хедеры:
Код: 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
from asio::tcp::socket to std::stream
    #38164052
bdm77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

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


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