2015-02-12 2 views
1

Я начал изучать boost :: asio и пытался сделать простое клиент-серверное приложение. Сейчас у меня проблемы с сервером. Здесь он содержит код:boost :: asio read/write problem

int main(int argc, char* argv[]) 
{ 
    using namespace boost::asio; 

    io_service service; 
    ip::tcp::endpoint endp(ip::tcp::v4(), 2001); 
    ip::tcp::acceptor acc(service, endp); 

    for (;;) 
    { 
     socker_ptr sock(new ip::tcp::socket(service)); 
     acc.accept(*sock); 
     for (;;) 
     { 
      byte data[512]; 

      size_t len = sock->read_some(buffer(data)); // <--- here exception at second iteration 

      if (len > 0) 
       write(*sock, buffer("ok", 2)); 
     } 
    } 
} 

Он правильно принял клиентский сокет, правильно прочитал, затем записывает данные и отправляет новую итерацию. На второй итерации выбрасывается исключение. Это выглядит так: enter image description here И я не понимаю, почему это происходит? Мне просто нужно, чтобы сервер постоянно читал/писал, пока клиент присутствует. И когда клиент ушел, сервер должен принять следующего клиента.

Итак, главный вопрос: почему происходит прослеживание и как его использовать?

...

Update1: Я обнаружил, что при первой итерации код ошибки и чтения/записи операция прошла успешно. Но (!) На второй итерации на месте, где исключение исправило код ошибки «Конец файла». Но почему?

+0

Вы должны быть переходящие в максимальном размере буфера (512) в качестве второго параметра в буфер для read_some. Я сомневаюсь, что это основная причина, однако нет разумного метода для буфера для определения длины массива байтов. – Mark

+0

Хм, это не поможет. Я отмечаю, что первая итерация полностью прошла отлично, но на второй итерации она терпит неудачу. Я попытался добавить размер буфера «size_t len ​​= sock-> read_some (буфер (данные, 512));». Но это не помогает. Проблема все еще присутствует. – AeroSun

+0

@sehe: #tmyk! Спасибо за указание на это. Я не знал, что существует компилятор для автоматического определения количества элементов в массиве. Я стою исправлено. – Mark

ответ

1

Вы получаете условие окончания файла, потому что удаленный конец соединения закрыл или сбросил соединение.

Вы должны обращаться с системными ошибками или использовать перегрузки, которые ссылаются на boost::system::error_code. Как еще вы закончите бесконечный цикл?

Live On Coliru

#include <boost/asio.hpp> 
#include <iostream> 

int main() 
{ 
    using namespace boost::asio; 

    io_service service; 
    ip::tcp::endpoint endp(ip::tcp::v4(), 2001); 
    ip::tcp::acceptor acc(service, endp); 

    for (;;) 
    { 
     ip::tcp::socket sock(service); 
     acc.accept(sock); 
     boost::system::error_code ec; 

     while (!ec) 
     { 
      uint8_t data[512]; 

      size_t len = sock.read_some(buffer(data), ec); 

      if (len > 0) 
      { 
       std::cout << "received " << len << " bytes\n"; 
       write(sock, buffer("ok", 2)); 
      } 
     } 

     std::cout << "Closed: " << ec.message() << "\n"; 
    } 
}