![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по отслеживанию подключений [D6, Win2k, WinXP]
FireMan_Alexey © (2007-06-20 20:08:00)Наверное вопрос переадресуют, но мне кажется что это в эту ветку!
Мне нужен совет, название и где взять программу, которая могла бы отслеживать подключения и что передается через LoopBack(127.0.0.1) без сетевой карты.
Нужно проследить сколько подключений осуществляет IE к серверу Apache и что передает (туда/обратно).
Сразу поясню для чего это нужно(чтобы снова никто не занимался телепатией).
Я написал потоковый прокси. Установил Апачи для тестирования. Через прокси соединения к Апачам осуществляются, но только до 10 соединений. После этого как я получаю 10 соединений Апачи выдают ошибку 10061 WSAECONNREFUSED и вдальнейшем не работают вообще(ну разумеется до перезагрузки Апачей, т.е. остановки и запуска. Просто пункт рестарт не дает никакого результата).
НОкогда с апачами работает ИЕ, таких глюков не наблюдается. Я могу просмотреть весь сайт без потери соединения. Я хотел бы выяснить как именно ИЕ удается получить всю информацию и не потушить Апачи?
Сергей М. (2007-06-28 08:36:00) [1]
> Испробывал я и компоненты TSocketClient/Server но они не
> удовлетворили мои запросам
Интересно, каким ?
> насчет TThread-a, пока не хочу изобретать вилосипед заново
А его и не надо изобретать)
Просто тут логичней бы было использовать BeginThread(), коль уж так тебе так претят классы с ихними исключениями, кои ты так невзлюбил.
> Апачи умирают!
> Из этого делаю вывод, что моя логика работает, а это все
> особенности самих апачей
Не обратить ли тебе серьезное внимание на версию и конфигурацию Апача ?
FireMan_Alexey (2007-06-27 14:26:00) [2]Понимаешь, для меня было удобно сделать именно так!
При чем в полной версии в каждом потоке, для отдельных клиентов имеется ограничение по скорости передачи и т.д.
Скажу сразу, я не очень люблю ловить ексепты, поэтому лучше TThread и WSAPI для Меня :)
Я поставил чужой прокси на мою машину и результат был тот же 10061 и Апачи умирают!
Из этого делаю вывод, что моя логика работает, а это все особенности самих апачей! :)
Я потом попробую поменять сервер на какой-нибудь другой
А выигрывать я не хотел! :)
Просто этот проэкт я писал еще 2004, ну а сейчас не очень хотелось бы переделывать его.
Испробывал я и компоненты TSocketClient/Server но они не удовлетворили мои запросам! тем более что в моем случае лучше было писать на WSAPI.
А насчет TThread-a, покане хочу изобретать вилосипед заново :)
На счет названия переменных.
Мой опыт показывает, что когда на этот форум передаю исх. коды то переменные типа
l1, k1 - и т.д. тоже не показывают для чего они используются.
Мой подход насчет FClientS - т.е. на данном сокете находится клиент т.е. ИЕ,
аналогично FServerS - сокет соединен с сервером.
Для меня так легче, тем более я пишу для себя и не претендую на супер оптимальный и понятный код. :)
Сергей М. (2007-06-25 08:50:00) [3]
> прокси потоковый
Я тоже не хочу обидеть, но "потоковый" твой прокси или "не потоковый" - по барабану.
> CloseSocket(FClientS); - сокет соединение с ИЕ
> CloseSocket(FServerS);- сокет соединение с Апачами(или инетом)
Страннное у тебя смысловое именование идентификаторов ..
Твой прокси по отношению к Апачу является клиентом, а сокет почему-то именуется F ServerS. По отношению к браузеру твой прокси является сервером, в то время как соотв.сокет почему-то F ClientS..
Это, конечно, не суть как важно, но путаницу вносит.
> каждое соединение находится в отдельном код потоке(TThread)
Мне не понятно, где ты выграл, пользуя вместо прямого API-программирования потоков готовый поточный класс TThread, в то время как транспорт программируешь непосредственно на WSAPI, не прибегая к услугам готовых классов ..
FireMan_Alexey (2007-06-22 14:21:00) [4]Я не хочу обидеть, но в вопросе я указал, что прокси потоковый!
Т.е. каждое соединение находится в отдельном код потоке(TThread).
А значит по завершению потока каждый сокет будет закрыт!
Это я гарантирую! :)
FireMan_Alexey (2007-06-22 14:14:00) [5]CloseSocket(FClientS); - сокет соединение с ИЕ
CloseSocket(FServerS);- сокет соединение с Апачами(или инетом)
Слушающий сокет находится в другом код потоке!
Сергей М. (2007-06-22 08:27:00) [6]Если я правильно понял, то
> CloseSocket(FClientS);
Здесь ты закрыл некое односоединение с Апачем.
А где закрытие других соединений с ним ?
> CloseSocket(FServerS);
Здесь ты закрыл свое слушающее гнездо.
А где закрытие существующих соединений браузера с твоим сервером ?
Anatoly Podgoretsky (2007-06-22 00:40:00) [7]> FireMan_Alexey (22.06.2007 00:36:32) [32]
Я не знаю, что делать с Апачем, но он держит открытыми соединения, меня этот вопрос просто не интересовал, я для этой цели использую серверную платформу - или Линукс или Win2003
Не пытаюсь на Камазе устраивать гонки по формуле 1
Anatoly Podgoretsky (2007-06-22 00:38:00) [8]> FireMan_Alexey (22.06.2007 00:34:31) [31]
Не знаю как, но важно, что получается свыше 10 разрешеных соединений к серверу. О чем я несколько раз и говорил. Решение естественное, если надо свыше 5/10 соединений, надо использовать серверную платформу, где таких ограничений нет.
FireMan_Alexey (2007-06-22 00:36:00) [9]>>Anatoly Podgoretsky
Очень нужна Ваша помощь, потому что я сам сейчас не в силах понять, то что происходит на стороне Апачей и каким образом он это делает!
FireMan_Alexey (2007-06-22 00:34:00) [10]Теперь не ясно одно, когда работает мой сервер и при разрыве соединения TCPView показывает что все соединения с сервером(т.е. у сервера) имеют статус TIME_WAIT, хотя мой сервер закрыл все соединения с клиентом и сервером!
Почему именно так я не знаю!
Простите наплел сильно!
Т.е. Когда ИЕ работает через мой прокси, то после дисконнекта, который совершает Апачи, предварительно прислав Connection: close, TCPView показывает что у Апачей все открытые и закрытые на тот момент сокеты находятся в состоянии TIME_WAIT. Как заставить Апачи закрывать все сокеты я не знаю. Т.к. всегда считал, что когда я получаю событие FD_CLOSE, тем более без кода ошибки, то сервер перед этим уже закрыл свой сокет(ну не тот, который ждет подключения конечно :) ) и поэтому я не могу понять, что я сделал не так!?!?!? И как Апачам удается послать оповещение о закрытии соединения со своей стороны и оставить сокет в режиме ожидания? :)
FireMan_Alexey (2007-06-22 00:16:00) [11]>Сергей М.
Посмотрел TCPView
Спасибо полезная программа!
Все оказалось как описывает Anatoly Podgoretsky ©
Теперь не ясно одно, когда работает мой сервер и при разрыве соединения TCPView показывает что все соединения с сервером(т.е. у сервера) имеют статус TIME_WAIT, хотя мой сервер закрыл все соединения с клиентом и сервером!
Почему именно так я не знаю!
Вот кусок кода:
Procedure Execute;
Begin
...
FEvents[0]:=WSACreateEvent;
FEvents[1]:=WSACreateEvent;
WSAEventSelect(FClientS,FEvents[0],FD_READ or FD_WRITE or FD_CLOSE);
WSAEventSelect(FServerS,FEvents[1],FD_READ or FD_WRITE or FD_CLOSE or FD_CONNECT);
While Not Terminated Do
Begin
...
// Транспортная логика!
...
End;
WSACloseEvent(FEvents[0]);
WSACloseEvent(FEvents[1]);
CloseSocket(FClientS);
CloseSocket(FServerS);
End;
Причем когда я проверял мой сервер(мною написанный), то соединения закрывались нормально! Почему Апачи не закрывает сокеты, после дисконнекта к нему(от него), не понятно?! Далее получается, что накапливается 10 соединений и при этом сервер перестает отвечать на какие-либо попытки коннекта!
Да замечу, что когда мой сервер не закрывал сокет после дисконнекта статус имел значение CLOSE_WAITа не TIME_WAIT.
Может кто знает почему именно так?
Сергей М. (2007-06-21 08:21:00) [12]
> где взять
Здесь
http://www.microsoft.com/technet/sysinternals/default.mspx
Только не вздумай запускать TCPMon на W2k-сервере - она тут же порушит сетевые интерфейсы
Сергей М. (2007-06-21 08:18:00) [13]
> FireMan_Alexey © (20.06.07 22:05) [27]
Возьми любую утилитку а-ля TCPMonitor, TDIMonitor и посмотри, какие гнезда открыты и какие соединения установлены Апачем в этой проблемной ситуации.
FireMan_Alexey (2007-06-20 22:05:00) [14]После чего сервер закрывал соединения!
При закрытии соединения с сервером на уровне клиента это расценивается как отказ от запроса! Причем не важно KeepAlive или нет.
Если я в чем-то не прав поправте меня!
FireMan_Alexey (2007-06-20 22:01:00) [15]Server присылал Connection: Close!
FireMan_Alexey (2007-06-20 21:53:00) [16]Даже после CloseSocket?
Anatoly Podgoretsky (2007-06-20 21:40:00) [17]> FireMan_Alexey (20.06.2007 21:36:22) [22]
KeepAlive
FireMan_Alexey (2007-06-20 21:38:00) [18]В первом и втором пункте используется серверные соединения!
У моего сервера через "Ацепт" и аналогично у Апачей!
FireMan_Alexey (2007-06-20 21:36:00) [19]Я не путаю!
1. ИЕ соединяется с моим сервером
2. Мой сервер пытается соединиться с сервером Апачей
3. Если соединяется то работает простая транспортная логика (получил/отправил)
4. Если нет включаю таймер и жду освобождения других соединений!
Вот тут то и получается, что сервер Апачей постоянно выдает 10061.
Потом выключаю свой сервер закрывая все соединения.
Переключаю ИЕ на прямую работу с Апачами и пытаюсь соединиться!
Также получаю 10061!!!!Вот этого я не могу понять!!!!!
Раз ХР поддерживает 10 серверных соединений, то почему после закрытия всех сокетов на моем сервере и перенастройке соединения ИЕ я получаю ошибку! Хотя Апачи не сообщает не о каких ошибках и делает вид как буд-то работает нормально!
Anatoly Podgoretsky (2007-06-20 21:21:00) [20]Ты путаешь серверные соединения с клиентскими.