Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Ограничение на количество открытых сокетов |
Автор: alltouch 7.6.2006, 13:43 |
Мне нужно загрузить прогой много страниц(примерно 1000) 1. Какое ограничение на количество открытых сокетов существует в винде и линухе??? 2. Я гружу каждую страницу в отдельном потоке (в винде с помощью библиотеки winsock, под линухом - обычными сокетами), когда поток работает больше 5 секунд я его вырубаю. Закрывается при этом сокет или нет?? если нет то как ево закрыть в этом случае??????? |
Автор: Dian 7.6.2006, 14:25 |
Закрывается через closesocket; Адресное пространство портов 0001-FFFF, скорее всего реальный предел будет меньше, но на пару тысяч хватит |
Автор: alltouch 13.6.2006, 10:01 |
а все таки можно какую-то примерную цыфру ограничения на количество одновременно открытых сокетов узнать???? |
Автор: deniska 13.6.2006, 10:15 | ||
так возьми проверь. если у тебя уже есть код для открывания 1000 страниц открой 2, 3, 4 тысячи пока все не грохнется ![]()
|
Автор: p0s0l 13.6.2006, 11:55 |
Загляни сюда: 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 13.6.2006, 13:27 |
У меня такая вот проблема, когда я гружу страницы через сокеты, то через определенное время(скоре всего после n-того открытого сокета) все остальные сокеты просто висят(в моем случае оставалось открытых пару штук) и сами завершаться не хотят, что в этом случае делать???? |
Автор: ptr 18.6.2006, 08:59 |
Для закрытия активного соединения используются две функции shutdown и closesocket. closesocket - экстренное закрытие сокета, при этом соединение разрывается сразу. После вызова closesocket сокет будет уже недоступен. Чтобы корректно инициировать закрытие сокета, нужно вызвать shutdown, а потом closesocket. При этом будут переданы все неотправленные данные и получены еще не принятые данные и сокет не будет висеть. |
Автор: alltouch 21.6.2006, 12:50 |
Не все так просто, сокеты я открываю в потоках, если поток успевает завершится за 5 секунд тогда сокет сам закрывается, если же нет, то я снимаю поток, при этом в деструкторе сокета прописано чтоб он его сам завершал автоматически... Но это не помогает бо все равно потом прога висит, чего-то ждет, чего именно я пока не знаю |
Автор: ptr 21.6.2006, 16:21 |
Так у тебя прога висит или сокеты? Кстати неплохо было бы видеть текст проги. |
Автор: alltouch 22.6.2006, 10:07 |
скорее всего высят сокеты, бо прога ничего не делает пока не завершаться все сокеты P.S. Код очень большой, какой кусок имеено выложить????? |
Автор: ptr 22.6.2006, 11:04 |
Лучше всего конечно весь, но если он такой большой, то ту часть, в которой непосредственно с сокетами работаешь. И долго твоя прога висит? Может просто она закрывает все открытые сокеты (ты же не один и не два сокета открываешь). |
Автор: alltouch 23.6.2006, 10:10 | ||||
Каждый сокет открывается в отдельном потоке, диспечер пзадач показывал что в моей проге было запущено 4 потока(2 главных и два на сокетах)!!! Вот мой класс для работы с сокетами:
Использую я его потом так:
|
Автор: ptr 23.6.2006, 14:01 |
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. Зачем вообще нужно два раза закрывать сокет. Закрывай его либо в самой функции, либо в деструкторе. Ну это, пожалуй на первый взгляд, и всё. |