Блокирующие сокеты
От: Shasoft Россия http://shasoft.com
Дата: 02.11.09 08:14
Оценка:
После долгих раздумий переделал HTTP прокси на блокирующие сокеты.
Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка.
Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0.
Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR.
Это у меня ожидания неправильные или с кодом что-то не то сделал?
Re: Блокирующие сокеты
От: MaxGl Украина  
Дата: 02.11.09 08:17
Оценка:
Здравствуйте, 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.
Re: Блокирующие сокеты
От: MaxGl Украина  
Дата: 02.11.09 08:19
Оценка:
Здравствуйте, 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.

Re: Блокирующие сокеты
От: std.denis Россия  
Дата: 02.11.09 08:19
Оценка:
S>Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR.
а что же нам говорит матчасть ?
Re: Блокирующие сокеты
От: Shasoft Россия http://shasoft.com
Дата: 02.11.09 08:24
Оценка:
Хм. Признаюсь, не до конца дочитал доки.
Всем спасибо за "тыканье" носом в нужный текст.
Re: Блокирующие сокеты
От: Shasoft Россия http://shasoft.com
Дата: 02.11.09 16:59
Оценка:
Здравствуйте, Shasoft, Вы писали:

S>После долгих раздумий переделал HTTP прокси на блокирующие сокеты.

S>Делаю всё достаточно стандартно. Один поток ловит подключения и создает для каждого потока отдельное соединение где и идет обработка.
S>Но столкнулся с такой ситуацией: в браузере жму отмена соединения. Но recv не возвращает ошибку (как я надеялся), а возвращает 0.
S>Я же ожидал, что при закрытие сокета на стороне браузера recv вернет SOCKET_ERROR.
S>Это у меня ожидания неправильные или с кодом что-то не то сделал?

Столкнулся со следующей проблемой. Читаю я первый запрос от браузера, отправляю запрос на сайт, получаю ответ от сайта и отправляю браузеру.
После чего, так как браузер на одном соединении может делать несколько запросов, вызываю recv и ожидаю следующего запроса от браузера.
Но браузер больше ничего не посылает. При асинхронном режиме приходит FD_CLOSE и я успешно закрываю соединение.
При блокирующем подходе программа подвисает. Т.е. либо
а) Браузер рвет соединение, а recv этого не понимает
б) либо браузер не разрывает соединения, а ожидает этого от моего прокси. Хотя, так как при асинхронном подходе сообщение о закрытии всё-таки приходит, то этот вариант как-то маловероятен.

Вопрос: Как-то можно этого избежать?

P.S. Вроде нашел упоминания о функции select, но по MSDN не особо понятно, когда же её использовать. Может есть статья на тему "select для чайников"?

P.S.2. В мозгу зреет мысль сделать эмуляцию блокирубщих вызовов через асинхронные сокеты, но как-то это наворочено получается, скорее всего какое-то стандартное решение есть для таких целей без велосипедов.
Re[2]: Блокирующие сокеты
От: std.denis Россия  
Дата: 02.11.09 17:11
Оценка:
или:
>в) Браузер решил оставить соединение прозапас и может в ближайшее время использовать его, или через некоторое время закрыть.

можно открыть TcpView и увидеть, что даже без использования прокси, браузер какое-то время сохраняет соединение.
Re[3]: Блокирующие сокеты
От: Shasoft Россия http://shasoft.com
Дата: 02.11.09 17:18
Оценка:
Здравствуйте, std.denis, Вы писали:

SD>или:

>>в) Браузер решил оставить соединение прозапас и может в ближайшее время использовать его, или через некоторое время закрыть.
SD>
SD>можно открыть TcpView и увидеть, что даже без использования прокси, браузер какое-то время сохраняет соединение.
Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет.
Re[4]: Блокирующие сокеты
От: MaxGl Украина  
Дата: 03.11.09 08:21
Оценка:
Здравствуйте, Shasoft, Вы писали:

S>Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет.

recv() не выходит?
Или возвращает 0, а ты его не проверяешь?
Re[5]: Блокирующие сокеты
От: Shasoft Россия http://shasoft.com
Дата: 06.11.09 16:12
Оценка:
Здравствуйте, MaxGl, Вы писали:

MG>Здравствуйте, Shasoft, Вы писали:


S>>Меня смущает то, что в асинхронном режиме приходит уведомление о закрытие, а в блокирующем нет.

MG>recv() не выходит?
MG>Или возвращает 0, а ты его не проверяешь?
Не выходит из recv.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.