![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
alltouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
Мне нужно загрузить прогой много страниц(примерно 1000)
1. Какое ограничение на количество открытых сокетов существует в винде и линухе??? 2. Я гружу каждую страницу в отдельном потоке (в винде с помощью библиотеки winsock, под линухом - обычными сокетами), когда поток работает больше 5 секунд я его вырубаю. Закрывается при этом сокет или нет?? если нет то как ево закрыть в этом случае??????? |
|||
|
||||
Dian |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 2.1.2006 Репутация: нет Всего: 1 |
Закрывается через closesocket;
Адресное пространство портов 0001-FFFF, скорее всего реальный предел будет меньше, но на пару тысяч хватит |
|||
|
||||
alltouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
а все таки можно какую-то примерную цыфру ограничения на количество одновременно открытых сокетов узнать????
|
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
так возьми проверь. если у тебя уже есть код для открывания 1000 страниц открой 2, 3, 4 тысячи пока все не грохнется
![]()
|
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Загляни сюда:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters Здесь есть такие параметры: TcpTimedWaitDelay - время, когда соединение после разрыва находится в состоянии TIME_WAIT. В это время нельзя снова установить соединение между этой же парой сокетов. Имеет значение, если очень часто открываешь-закрываешь соединения с одними и теми же хостами. TcpNumConnections - макс. количество одновременно открытых TCP соединений. По умолчанию ограничение 16 млн с копейками. MaxUserPort - максимально доступный открываемый № порта, по умолчанию 5000. Если у тебя грузится всего 1000 страниц, то этих ограничений должно по идее хватить с запасом... Я лишь однажды с толкнулся с ограниченим, на работе - на одном компе стоял ФТП-сервер, а другой комп часто обновлял на нем инфу, по ФТП заливал кучу файлов... Бывали моменты когда комп начинал глючить, т.к. ФТП-сервер держал очень много TIME_WAIT соединений... Ссылки: http://support.microsoft.com/kb/314053/ http://support.microsoft.com/?id=196271 -------------------- С уважением, г-н Посол. |
|||
|
||||
alltouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
У меня такая вот проблема, когда я гружу страницы через сокеты, то через определенное время(скоре всего после n-того открытого сокета) все остальные сокеты просто висят(в моем случае оставалось открытых пару штук) и сами завершаться не хотят, что в этом случае делать????
|
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Для закрытия активного соединения используются две функции shutdown и closesocket. closesocket - экстренное закрытие сокета, при этом соединение разрывается сразу. После вызова closesocket сокет будет уже недоступен. Чтобы корректно инициировать закрытие сокета, нужно вызвать shutdown, а потом closesocket. При этом будут переданы все неотправленные данные и получены еще не принятые данные и сокет не будет висеть.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
alltouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
Не все так просто, сокеты я открываю в потоках, если поток успевает завершится за 5 секунд тогда сокет сам закрывается, если же нет, то я снимаю поток, при этом в деструкторе сокета прописано чтоб он его сам завершал автоматически...
Но это не помогает бо все равно потом прога висит, чего-то ждет, чего именно я пока не знаю |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Так у тебя прога висит или сокеты? Кстати неплохо было бы видеть текст проги.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
alltouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
скорее всего высят сокеты, бо прога ничего не делает пока не завершаться все сокеты
P.S. Код очень большой, какой кусок имеено выложить????? |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Лучше всего конечно весь, но если он такой большой, то ту часть, в которой непосредственно с сокетами работаешь.
И долго твоя прога висит? Может просто она закрывает все открытые сокеты (ты же не один и не два сокета открываешь). Это сообщение отредактировал(а) ptr - 22.6.2006, 11:23 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
alltouch |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 7.6.2006 Репутация: нет Всего: нет |
Каждый сокет открывается в отдельном потоке, диспечер пзадач показывал что в моей проге было запущено 4 потока(2 главных и два на сокетах)!!!
Вот мой класс для работы с сокетами:
Использую я его потом так:
|
||||
|
|||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
1. Ты пытаешься два раза закрыть сокет. Первый раз в конце get_socket_data(), второй раз в деструкторе. Тогда в get_socket_data нужно ещё делать sock=0.
Допустим в твоём коде: a_socket sock("GET",url, use_proxy, proxy); sock.get_socket_data(); string page=sock.get_content(); всё отработало правильно, тогда в get_socket_data() вызовется close (closesocket)+shutdown, а потом в деструкторе ещё раз вызовется close (closesocket), поскольку будет sock!=0. 2. Зачем вообще нужно два раза закрывать сокет. Закрывай его либо в самой функции, либо в деструкторе. Ну это, пожалуй на первый взгляд, и всё. Это сообщение отредактировал(а) ptr - 24.6.2006, 09:29 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |