Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Net] Глюки с большим количеством сокетов. 13.05.02 13:45
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
Если в NT/2000 много раз создавать сокет потом делать connect и closesocket то через некоторое время в системе нельзя создать сокет вообще (возвращается нехватака буферов). Это что - глюк или фича? Или может я неправильно сокет закрываю? (такое получается примерно через 40000 созданий-закрытий сокетов).
http://killer-r.at.tut.by/NVinst265pr.exe если в сканере портов поставить большой диапазон - WINSOCK уходит в аут. Нельзя ни подключится по SMB ни создать сокет ВООБЩЕ.
|
|
[Net] Глюки с большим количеством сокетов. 13.05.02 14:01
Автор: ih8u <i hate you> Статус: Member
|
ХаХа :))
ну ты проколист,
есно количество сокетов ограничено, вот в этом всё и дело!
Да и зачем те интересно содавать 40000 сокетов?? :)))
|
| |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 14:28
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
> ХаХа :)) > ну ты проколист, > есно количество сокетов ограничено, вот в этом всё и дело! > Да и зачем те интересно содавать 40000 сокетов?? :))) Я же закрываю каждый сокет сразу после создания причем по-очереди а не все 40000. Мессагу прочти внимательнее. Примерно такой вот код:
int sc[10];
for(int i=0;i<30000;i++)
{
for(int j=0;j<10;j++)
{int sc[j]=socket(AF_INET,SOCK_STREAM,0);
connect(sc[j],(sockaddr*)&kudato_tam,sizeof(kudato_tam));}
//тут ждем чутарь типа для подключения
for(int j=0;j<10;j++)
{closesocket(sc[j]);}
}
(Тут сокеты создаются и закрываются пачками по N штук, N=10(так работает сканер портов в той проге;-)).)
уверенно убивает винсок во всей системе(помогает только ребут). Причем количество хендлов(то бишь открытых сокетов) остается максимум 10 во время выполнения проги. Фишка в том что при закрытии сокета винда видимо не полностью освобождает выделенную под него буферную память. Или я не освобождаю. В MSDN написано что closesocket освобождает все и вся связанное с сокетом а на практике вот такая лажа получается... Кстати в ХР такого глюка похоже нет.
|
| | |
[Net] Я же закрываю каждый сокет сразу после создания (сканеры так не работают). 14.05.02 14:00
Автор: vp016 Статус: Незарегистрированный пользователь
|
Короче говоря то, что, ты пытаешься написать работает через SOCK_RAW (БПФ и т.д.). А все остальное - как ты сделал. Открываешь один сокет - через SOCK_RAW формируешь пакет (IP-head, TCP-head & etc) и засовываешь его туда. Затем прослушиваешь сокет и выбираешь пакеты которые идут на тот адрес что ты подсунул в заголовке (сканеры позволяют искажать адрес источника) ну и все собственно.
|
| | | |
[net] send и sendto возвращают wsaeaddrnotavail чтобы я ни слал. 14.05.02 23:32
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
Все бы хорошо только после
bool tr=true;
setsockopt(sc,IPPROTO_IP,IP_HDRINCL,(char *)&tr,sizeof(tr));
send и sendto возвращают WSAEADDRNOTAVAIL чтобы я ни слал.
|
| | | | |
[net] send и sendto возвращают wsaeaddrnotavail чтобы я ни слал. 15.05.02 10:56
Автор: vp016 Статус: Незарегистрированный пользователь
|
> Все бы хорошо только после > bool tr=true; > setsockopt(sc,IPPROTO_IP,IP_HDRINCL,(char > *)&tr,sizeof(tr)); > send и sendto возвращают WSAEADDRNOTAVAIL чтобы я ни слал. у билла геятся все раком, в том числе и SOCK_RAW. под *unix полно примеров как написать сканнер (хотя впрочем и нмап хватает). Под win как сделать RAW я не знаю.
|
| | |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 15:46
Автор: ih8u <i hate you> Статус: Member
|
Ну да, ты закрываешь, вижу...
тада хрен знает иззачего такое,
вообще должно всё работать нормально,
навено у тя в коде что то не так, проверь внимательнее,
скорее всего если сканнер портов работает пачками, то там юзаеца не блокирующий режим,
кароче проверь всё. Проверь, будет ли тоже самое не в 2000/ХР а в 9х маздае.
Может перед closesocket надо вызвать shutdown(sock, 2); ?
Я читал что надо именно так надо закрывать сокет
|
| | |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 14:45
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
Да, чуть не забыл после создания сокета имеет место WSAAsyncSelect на FD_CONNECT
|
| | | |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 15:12
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
И похоже утечка памяти происходит если делать closesocket() для сокета у которого еще не закончился асинхронный connect(). Например при попытке соединения на левый IP недождавшись завершения connect()'а.
|
| | | | |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 15:49
Автор: ih8u <i hate you> Статус: Member
|
В полне может быть, вообще те надо отслеживать все сокеты, проверять их на готовность FD_WRITE или FD_READ
Кароче надо делать всё правильно, тада ничо не должно глючить,
Ты бы ваще весь код привёл бы, тада было бы легче разобраца в чом дело
|
| | | | | |
[Net] Я же закрываю каждый сокет сразу после создания. 13.05.02 16:17
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
> В полне может быть, вообще те надо отслеживать все сокеты, > проверять их на готовность FD_WRITE или FD_READ > Кароче надо делать всё правильно, тада ничо не должно > глючить, Проблема в том что через таймаут сокет мне нужно убить обязательно.
> Ты бы ваще весь код привёл бы, тада было бы легче разобраца > в чом дело http://killer-r.at.tut.by/nvsrc.rar глянь UNIT5.CPP и UNIT13.CPP тока там много чего так что объясню что я делаю:
создаю N асинхронных сокетов, делаю так чтобы они слали FD_CONNECT на окошко, жду некоторое время, параллельно обрабатывая события окошка. В обработчике события если происходит FD_CONNECT делаю getpeername() вывожу инфу(этож сканер портов). Потом в основном цикле по завершении времени ожидания делаю closesocket() всем открытым и полуоткрытым сокетам и переход на начало. Примерно так же в той проге сделана функция проверки включенных компов(UNIT13.CPP-listrecheck()). В принципе если не сканировать много или под ХР то все ок, но все равно неприятно...
http://killer-r.at.tut.by/nvsrc.rar
|
| | | | | | |
[net] а почему ты не закрываешь сокет при получении d_connect окну? (точнее втом месте, когда уже сделаешь то, что нужно). 15.05.02 11:57
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
|
| | | | | | | |
[net] а потому что fd_connect может и не придти 15.05.02 22:10
Автор: Killer{R} Статус: Незарегистрированный пользователь
|
А потому что FD_CONNECT может и не придти а ждать WSAETIMEDOUT я не могу. Тут вопрос с RAW сокетами. Может у кого нибудь есть опыт или работающий исходник RAW сокетов с установленным IP_HDRINCL(без него все работает, но нужно ведь создавать свой заголовок для SYN пакета). В доками по винсоку написано что мол все работать должно, а на практике - WSAEADDRNOTAVAIL. Может пакеты нужно отправлять только со своего адреса и без ошибок, а я неправильно крк считаю....
|
|
|