После долгих раздумий переделал HTTP прокси на блокирующие сокеты.
Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка.
Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0.
Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR.
Это у меня ожидания неправильные или с кодом что-то не то сделал?
Здравствуйте, Shasoft, Вы писали:
S> Но recv не возвращает ошибку (как я надеялся), а возвращает 0.
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.
Здравствуйте, Shasoft, Вы писали:
S>После долгих раздумий переделал HTTP прокси на блокирующие сокеты. S>Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка. S>Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0. S>Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR. S>Это у меня ожидания неправильные или с кодом что-то не то сделал?
Это из man'a:
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.
Здравствуйте, Shasoft, Вы писали:
S>После долгих раздумий переделал HTTP прокси на блокирующие сокеты. S>Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка. S>Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0. S>Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR. S>Это у меня ожидания неправильные или с кодом что-то не то сделал?
Столкнулся со следующей проблемой. Читаю я первый запрос от браузера, отправляю запрос на сайт, получаю ответ от сайта и отправляю браузеру.
После чего, так как браузер на одном соединении может делать несколько запросов, вызываю recv и ожидаю следующего запроса от браузера.
Но браузер больше ничего не посылает. При асинхронном режиме приходит FD_CLOSE и я успешно закрываю соединение.
При блокирующем подходе программа подвисает. Т.е. либо
а) Браузер рвет соединение, а recv этого не понимает
б) либо браузер не разрывает соединения, а ожидает этого от моего прокси. Хотя, так как при асинхронном подходе сообщение о закрытии всё-таки приходит, то этот вариант как-то маловероятен.
Вопрос: Как-то можно этого избежать?
P.S. Вроде нашел упоминания о функции select, но по MSDN не особо понятно, когда же её использовать. Может есть статья на тему "select для чайников"?
P.S.2. В мозгу зреет мысль сделать эмуляцию блокирубщих вызовов через асинхронные сокеты, но как-то это наворочено получается, скорее всего какое-то стандартное решение есть для таких целей без велосипедов.
или: >в) Браузер решил оставить соединение прозапас и может в ближайшее время использовать его, или через некоторое время закрыть.
можно открыть TcpView и увидеть, что даже без использования прокси, браузер какое-то время сохраняет соединение.
Здравствуйте, std.denis, Вы писали:
SD>или: >>в) Браузер решил оставить соединение прозапас и может в ближайшее время использовать его, или через некоторое время закрыть. SD> SD>можно открыть TcpView и увидеть, что даже без использования прокси, браузер какое-то время сохраняет соединение.
Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет.
Здравствуйте, Shasoft, Вы писали:
S>Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет.
recv() не выходит?
Или возвращает 0, а ты его не проверяешь?
Здравствуйте, MaxGl, Вы писали:
MG>Здравствуйте, Shasoft, Вы писали:
S>>Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет. MG>recv() не выходит? MG>Или возвращает 0, а ты его не проверяешь?
Не выходит из recv.