Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по отслеживанию подключений [D6, Win2k, WinXP]


Страницы:   1 2

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]

Ты путаешь серверные соединения с клиентскими.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо