Как отправлять сообщения между сервером и клиентом, используя стандартную библиотеку сети C ++ TS - PullRequest
3 голосов
/ 07 октября 2019

Я пытался следовать руководству от boost , однако API не идентичен, поэтому мне пришлось угадывать некоторые части.

Моя попытка пока что показана ниже:

#include <iostream>
#include <experimental/internet>
#include <experimental/socket>
#include <thread>
#include <chrono>

using namespace std::experimental;

int main(int argc, char* argv[])
{

    std::thread server = std::thread([]()
    {
        std::cout << "Starting server" << std::endl;

        net::io_context context;
        net::ip::tcp::endpoint endpoint{net::ip::tcp::v4(), 1234};
        net::ip::tcp::acceptor acceptor{context, endpoint};
        acceptor.non_blocking(true);
        std::cout << "opened server on " << endpoint << std::endl;
        std::error_code error;
        net::ip::tcp::socket socket(context);
        while (true)
        {
            socket = acceptor.accept(error); //accept connections
            if (!error) //if connected with a client
            {
                std::cout << "Connected to client!" << std::endl;

                std::this_thread::sleep_for(std::chrono::seconds(2));
                std::string data = "Hello World!";
                net::const_buffer buf(&data, sizeof(data));
                socket.send(buf);
                std::cout << "Sent data!" << std::endl;
                while(true) {}
            }
        }
    });


    std::thread client = std::thread([]()
    {
        net::io_context context;
        net::ip::tcp::socket socket(context);

        net::ip::tcp::endpoint server{net::ip::tcp::v4(), 1234};
        std::error_code error;
        while(true)
        {
            socket.connect(server, error); //attempt to connect
            if (!error) //if connected
            {
                std::cout << "Connected to server!" << std::endl;
                net::mutable_buffer buf;
                while(buf.size() == 0)
                {
                    socket.receive(buf);
                }
                std::cout << "Received data!" << std::endl;
                std::cout << buf.data() << std::endl;
                while(true) {}
            }
        }

    });

    server.join();

    return 0;
}

Сервер и клиент соединяются, но клиент не получает сообщение. Выходные данные из вышеприведенной программы:

Starting server
opened server on 0.0.0.0:1234
Connected to server!
Connected to client!
Sent data!

И затем он ждет вечно.

Как получить сокет для правильного получения данных?

1 Ответ

1 голос
/ 07 октября 2019

Это

std::string data = "Hello World!";
net::const_buffer buf(&data, sizeof(data));

неправильно. Вы хотите отправить содержимое строки data, а не ее внутренние байты. &data дает указатель на базовые данные экземпляра строки, а не ее содержимое. Если вы хотите создать буфер, который представляет содержимое data, вы можете сделать:

const std::string data = "Hello World!";
net::const_buffer buf = net::buffer(data);

Этот

net::mutable_buffer buf;
while(buf.size() == 0)
{
    socket.receive(buf);
}

дает вам бесконечный цикл, потому что начальный размер bufравно 0, поэтому receive читает 0 байтов и возвращает. Затем, когда условие проверено, размер буфера по-прежнему равен 0, и цикл продолжается.

Перед вызовом receive вам необходимо указать размер буфера - он указывает, сколько байтов необходимо прочитать. Вы отправляете Hello World! так

std::string msg;
msg.resize(12); // prepare space for incoming data
net::mutable_buffer buf = net::buffer(msg);
socket.receive(buf);
std::cout << "I got: " << msg << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...