Я начал изучать 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));
}
}
}
Он правильно принял клиентский сокет, правильно прочитал, затем записывает данные и отправляет новую итерацию. На второй итерации выбрасывается исключение. Это выглядит так: И я не понимаю, почему это происходит? Мне просто нужно, чтобы сервер постоянно читал/писал, пока клиент присутствует. И когда клиент ушел, сервер должен принять следующего клиента.
Итак, главный вопрос: почему происходит прослеживание и как его использовать?
...
Update1: Я обнаружил, что при первой итерации код ошибки и чтения/записи операция прошла успешно. Но (!) На второй итерации на месте, где исключение исправило код ошибки «Конец файла». Но почему?
Вы должны быть переходящие в максимальном размере буфера (512) в качестве второго параметра в буфер для read_some. Я сомневаюсь, что это основная причина, однако нет разумного метода для буфера для определения длины массива байтов. – Mark
Хм, это не поможет. Я отмечаю, что первая итерация полностью прошла отлично, но на второй итерации она терпит неудачу. Я попытался добавить размер буфера «size_t len = sock-> read_some (буфер (данные, 512));». Но это не помогает. Проблема все еще присутствует. – AeroSun
@sehe: #tmyk! Спасибо за указание на это. Я не знал, что существует компилятор для автоматического определения количества элементов в массиве. Я стою исправлено. – Mark