|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.04.2014, 19:50 | #1 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
WinSock, Не могу разорвать коннект!
Всем привет! Уже третьи сутки не могу разорвать все коннекты в приложении.
Есть серверное приложение, которое должно работать неделями без перезапуска. Но из созданных 10к подключений, примерно 500-700 остаются висеть не закрытыми. Я пытался и читать данные перед закрытием(думал вдруг нельзя закрыть пока не прочтёшь все данные с сокета, конечно идея бредовая, но проверяю всё, ибо реально задолбался) Вот код, я сейчас так пытаюсь закрыть коннекты: Код:
Очень прошу подсказать как жестко, на 100% обрубить коннект. Приветствуются любые ссылки на инфу(msdn читал про закрытие портов, чтото не видел нужной инфы) p.s. код на делфи, но это не имеет значения, когда пишешь на винсок+винапи код делфи-си и наоборот переводится легко. Всем заранее спасибо! |
29.04.2014, 21:23 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
29.04.2014, 21:37 | #3 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Фаервол.
как набирает чуть больше 5к незакрытых, не может создать больше(сервак винда, такие ограничения) |
29.04.2014, 22:03 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А попробуй проверку поставить на closesocket
что она возвращает. Если не 0 то через WSAGetLastError() полуйчай код ошибки и пиши его в лог файл. Так хотя бы поймешь из-за чего может не закрываться. P.S. А можешь выложить всю прогу? А то я тут прослушки не вижу, и не могу понять как ты обустроил работу с несколькими сокетами...
I'm learning to live...
Последний раз редактировалось Stilet; 29.04.2014 в 22:06. |
29.04.2014, 22:19 | #5 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Забыл написать, делал, всегда ноль возвращает.
Выложить не могу, Но работа с сокетами выполняется в потоке, 1 поток 1 сокет. Блокирующий режим. Код:
Последний раз редактировалось lollollollol; 29.04.2014 в 22:21. |
30.04.2014, 10:41 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
10K потоков?!?
Прочитайте про SO_LINGER - может проблема в этом. Так же вот еще материалы: http://www.isi.edu/touch/pubs/infoco...nfocomm99-web/ http://stackoverflow.com/questions/7...e-wait-problem http://msdn.microsoft.com/en-us/libr...v=bts.20).aspx http://publib.boulder.ibm.com/infoce...ccllal0264.htm |
30.04.2014, 11:02 | #7 | ||
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Цитата:
10к подключений в сумме набираются со временем. потоков 30. Серверное ПО должно неделями не выключаться, и обрабатывать информацию/запросы Цитата:
Код:
|
||
30.04.2014, 11:20 | #8 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Ссылки глянул, в реестре у меня вообще не было тех веток, создал, тоже самое
|
30.04.2014, 12:12 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Да, тот самый linger - я не заметил, что он есть...
Насчет отсуствия ключей в реестре - весьма странно. Может не туда смотрите? Не путаете LOCAL_MACHINE и CURRENT_USER? |
30.04.2014, 12:17 | #10 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
нет вроде,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ntrolSet\services\Tcpip\Parameters (это с открытой ветки в regedit скопировал) для теста быстро создаю 2к подключений, из них 80 остаются висеть. Самое интересное что фаерволом их можно разорвать, а программой моей не могу. Closesocket возвращает ноль. Может быть существует какой-нибудь жесткий способ обрубить подключение? ну фаервол же как-то это делает(хотя он скорей всего это делает на уровне драйвера). поигрался с лингером, такое впечатление что вообще никакой реакции. что с ним, что без него. Может я неверно устанавливаю... Долго гипнотизировал строку setsockopt(s,SOL_SOCKET,SO_LINGER,@ l,sizeof(l)); но ничего не увидел... Добавлю ещё что соединения отаются висеть, даже когда выхожу из потока ExitThread(0), и закрываю хендл потока CloseHandle(ThID); |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разорвать adsl соединение | megostudent | Работа с сетью в Delphi | 5 | 28.03.2012 16:43 |
не могу сделать правильный пост запрос на winsock | cable | Работа с сетью в Delphi | 0 | 10.07.2010 18:01 |
Разорвать Dial-Up соединение | Михаил Юрьевич | Работа с сетью в Delphi | 0 | 19.12.2009 12:43 |
Как обработать не валидный коннект?(delphi,winsock) | zotox | Работа с сетью в Delphi | 1 | 02.08.2009 19:46 |
Как разорвать связи? | valerij | Microsoft Office Excel | 5 | 18.05.2009 23:36 |