Я пишу клиента, который должен прослушивать сокет домена. Я открываю синхронное соединение, выполняю синхронную запись, и я знаю, что сервер отправляет действительный ответ, потому что я использую socat для eavesdrop в сокете.Asio не получает ответа от удаленной системы
За исключением моего asio::read()
вызывается, но никогда не возвращает никаких данных. Буфер, который я передаю ему, всегда пуст. Вот мой код:
void operator>>(const vector<unsigned char> input, Socket &socket) {
const size_t size = input.size();
const size_t bytes = asio::write(socket.connection_socket, asio::buffer(input, size));
if (bytes != size) {
const std::error_code ec;
throw std::system_error(ec, fmt::format("Tried to send {0} bytes but sent {1} instead.", size, bytes));
}
string buffer;
asio::read(socket.connection_socket, asio::buffer(buffer));
std::cerr << buffer << std::endl;
}
Это свойство, которые я использую для подключения к гнезду:
io_service run_loop;
stream_protocol::socket connection_socket;
datagram_protocol::endpoint domain_socket_ep;
Socket
является простым классом, который окутывает весь код Asio, где выше объявляется перегрузка оператора ,
Не уверен, что я понимаю. Запись в сокет в порядке, asio просто не читает из него. Зачем вам писать и читать дважды? Кроме того, не read_to_buffer() делает то же самое, что и asio :: read_some? – ruipacheco
«_asio просто не читает из него», передавая строку с нулевым значением в функцию asio :: read, которую вы сообщаете asio, чтобы читать нулевые байты. Сокеты TCP не знают, сколько байтов вы отправили. "_ как и asio :: read_some_", извините, я не вижу функцию 'asio :: read_some', указанную в [API] (http://www.boost.org/doc/libs/1_62_0/doc/html/ boost_asio/reference.html), о котором вы говорите? –
Я имел в виду socket.read_some(): http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/basic_stream_socket/read_some/overload1.html – ruipacheco