![]() |
|
Модераторы: feodorv |
![]()
|
|
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Был открыт сокет на определённом порту, программа работала - работала, потом случилось так, что программе понадобилось открыть новое соединение на этом порту, но предыдущее - закрыть не представляется возможным (данные о дескрипторе сокета отсутствуют). При попытке забиндиться программа вернёт "address already in use" есесно.
Вопрос: как мне закрыть старую сессию знаю порт? Машина локальная. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Это как? Про это поподробнее. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| SparF |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
желательно с кодом
-------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
|||
|
||||
| Dude03 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: нет Всего: 6 |
Могу предложить грязненький хак:
можно перебрать все идентификаторы сокетов и для каждого получить порт. Если порт - тот самый - действуем...=) |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Был дескриптор, потом, например, программу перезапустили, незакрыв сокет - он остался в системе. Через некоторое время ОСь конечно сама его закроет, но меня интересует возможность закрыть самому. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Dude03 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: нет Всего: 6 |
В винде такой проблемы нету=). Указывай в следующий раз свою операционную систему.
|
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
dude
Альт Линукс -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| SparF |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
ну можно и "ручками" (в смысле - в программе учесть) его закрыть в этот момент
По идее освобождение ресурсов происходит сразу же, при закрытии сокета. Но тут можете сыграть злую шутку tcp - сетевая подсистема будет ждать какого-то события, а потом закроет, наконец, соединение по тайм-ауту. Что говорят
Покажите код, а то на пальцах рассуждаем.... -------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
||||
|
|||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
В деструкторе есесно всё прописано, но я имею ввиду аварийную принудительную остановку. Какую его часть именно? создание сокета? Попытка connect()'а? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| SparF |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
аварийная остановка - это именно аварийная остановка, ситуация экстренная. После нее ядру приходится разгребать все то, что когда-то было процессом. Но и тут есть свои приколы. Так, к примеру
всего навсего посылает процессу сигнал SIGTERM, а на него можно повесить обработчик, который уже будет закрывать соединение и т.д. и т.п., иными словами - грамотно освобождать ресурсы. Если же прога ну совсем висит, то решение одно:
этот посылает уже SIGKILL, его уже не перехватишь, вот это действительно экстренное завершение. Но такое бывает, только если прога написана некорректно. Решение одно - писать надо так, чтобы не зависало) -------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
||||
|
|||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Да нет, ты меня не понял. Во время выполнения программы нажимаю ctrl + z и всё.
И вообще - это не имеет значения вопрос-то: как закрыть уже открытый сокет, не имея его дескриптора, но зная порт? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| SparF |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
Так это не должно завершать процесс. Это просто останавливает его, и убирает в фон! (В случае если используется bash) man bash
А это значит, что процесс остается запущенным (просто остановленным) и занимает сокет на законных основаниях.
посмотреть какой процесс открыл соединение на данном порту и грохнуть процесс.
выдаст даст PID, который надо убить) -------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
||||||
|
|||||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Нет, ты не прав. Даже грохнув процесс - некоторые сокеты всё равно не могут открыться. "Already in use" и всё.
Это сообщение отредактировал(а) Rickert - 20.3.2007, 05:49 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Так господа давайте по-порядку.
Если сокет используется несколькими процессами, то он закроется, только когда его закроет последний процесс. Поэтому, чтобы освободить сокет нужно убить процессы, использующие этот сокет.
Читаем и просвещаемся про TCP и сокеты, а также про SO_REUSEADDR (setsockopt). Например, в Стивенсе и Снейдере. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| SparF |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
ptr, за SO_REUSEADDR спасибо - не знал.
А в это время в манах все русским по белому написано)) man 7 ip
man 7 socket
-------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
||||
|
|||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
И что?
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |