Здравствуйте, Shasoft, Вы писали:
S>После долгих раздумий переделал HTTP прокси на блокирующие сокеты. S>Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка. S>Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0. S>Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR. S>Это у меня ожидания неправильные или с кодом что-то не то сделал?
Столкнулся со следующей проблемой. Читаю я первый запрос от браузера, отправляю запрос на сайт, получаю ответ от сайта и отправляю браузеру.
После чего, так как браузер на одном соединении может делать несколько запросов, вызываю recv и ожидаю следующего запроса от браузера.
Но браузер больше ничего не посылает. При асинхронном режиме приходит FD_CLOSE и я успешно закрываю соединение.
При блокирующем подходе программа подвисает. Т.е. либо
а) Браузер рвет соединение, а recv этого не понимает
б) либо браузер не разрывает соединения, а ожидает этого от моего прокси. Хотя, так как при асинхронном подходе сообщение о закрытии всё-таки приходит, то этот вариант как-то маловероятен.
Вопрос: Как-то можно этого избежать?
P.S. Вроде нашел упоминания о функции select, но по MSDN не особо понятно, когда же её использовать. Может есть статья на тему "select для чайников"?
P.S.2. В мозгу зреет мысль сделать эмуляцию блокирубщих вызовов через асинхронные сокеты, но как-то это наворочено получается, скорее всего какое-то стандартное решение есть для таких целей без велосипедов.