2015-06-25 2 views
2

Клиент является писать как этот
Garbage значение в повышение :: Массив использования с Boost, :: Asio

std::string line; 
    std::cin>>line;  
    boost::asio::write(socket, boost::asio::buffer(line)); 


Сервер является Чтение как этот

void reader(){ 
      socket_.async_read_some(boost::asio::buffer(buf), 
      boost::bind(&tcp_connection::handle_read,shared_from_this()));  
    } 
void handle_read() 
    { 
      std::cout.write(buf.data(),1024); 
      std::cout<<"\n"; 
    } 
    tcp::socket socket_; 
    boost::array<char, 1024> buf; 


Теперь, когда я пишу строку «Привет, как вы» от клиента, это просто печать «привет», а затем значения для мусора
здесь выход, который показывает сервер:

helloA0�B��B�����a�Pa�!0�B�b����uB�`�#K|BP�b��D4B���Bb�Pa���e��e�����pc�!0�Be���xB�`�#KcBe�:7B�����e��e��� 


как можно Я удалить этот мусор значение и получить полное сообщение/линию от клиента

ответ

3
  1. operator >> использует пробел как разделитель, как scanf(). Вы должны использовать std::getline().

    std::getline(std::cin, line); 
    
  2. Почему вы используете cout.write()? просто используйте operator <<.

    std::cout << buf.data(); 
    

    Конечно, вы должны заботиться '\0' -terminate. Вероятно, boost.asio дает размер полученных байтов вашему обработчику.

+0

И мусор проявляется из-за 2. Вы пишете 1024 байта, что намного больше, чем ваше сообщение. –

+0

@ tsv.dimitrov, поэтому он должен заботиться о '' \ 0''. – ikh

+0

Я думаю, std :: cout.write() всегда будет записывать количество (2-й параметр) числа байтов, независимо от того, существует ли \ 0 или нет. –

1

>> just reads up to the first delimiter, то есть пространство в вашем случае.

Другая проблема заключается в том, что вы не сообщите получателю, сколько времени ваше сообщение будет.

3

У вас есть три проблемы:

Прежде всего, вы пишете 1024 байт из буфера, независимо от того, сколько данных вы на самом деле читать.

Во-вторых, TCP-соединения - это streaming, что означает отсутствие границ сообщений, что приводит к тому, что один прием может получить меньше того, что было отправлено, и вам необходимо получить несколько сообщений для получения полного сообщения ,

В-третьих, на который отвечают другие, оператор ввода не работает так, как вы ожидаете.

Смежные вопросы