@sitev_ru
sitev.ru - мой блог ...

Как определить конец посылки по сокетам?

Использую сокеты на C++. Читаю данные с помощью функции recv в неблокирующем режиме. Нужно прочитать всю посылку.

Я написал вот так:

while (true) {
			int len = socket->recv(request.memory);
			if (len <= 0) break;
		}


Теперь понимаю, что это совсем не правильно... Как правильно написать?
  • Вопрос задан
  • 299 просмотров
Пригласить эксперта
Ответы на вопрос 2
@monah_tuk
Я коллегу выше дополню.

read/recv возвращает 0 когда соединение закрыто независимо от блокирующего или неблокирующего режима. Если у тебя данных нет в неблокирующем режиме, у тебя вернётся -1 и код ошибки будет EAGAIN или EWOULDBLOCK (WSAEWOULDBLOCK - на win). Проверить код ошибки можно спросив errno (*nix) или WSAGetLastError (win). Эти ошибки - не фатальные, соответственно нужно просто правильно их обработать. В большинстве случаев, правильная обработка - заигнорить :) и повторить запрос. Остальные ошибки обрабатываются согласно логике приложения, но часто - сессия закрывается.

А ещё, попробуйте использовать Asio/libuv или средства мультиплексирования типа select/poll/epoll/kqueue (или обёртки типа libev/libevent) или асинхронный IO средствами IOCP на Win. Asio и libuv реализуют паттерн проактор и предоставляют лучший асинхронный способ на каждой платформе.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Правильно написать что за сокеты вы используете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы