|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.05.2011, 18:42 | #1 |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
Доступность порта
Есть TServerSocket и TClientSocket. Нужно проверить доступность порта(а вдруг он занят? ). Перебор портов начинается с 1025 до 2049, далее можно не проверять. Как?
|
10.05.2011, 21:37 | #2 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Для сервера - в цикле пытайся активировать его на очередном проверяемом порту, с контролем соотв. отказов.
Для клиента - бессмысленная проверка. |
12.05.2011, 15:13 | #3 |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
Нашёл другое решение, поизящнее:
Код:
|
12.05.2011, 16:01 | #4 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Ну вызвал ты бинд, занял порт при этом.
Далее ты активируешь TServerSocket и он обламывается, потому что в ходе активации он вызывает тот же самый бинд для порта, который ты перед этим занял явным биндом. А для клиента бинд нафих не нужен. |
12.05.2011, 16:23 | #5 |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
mss, я протестил, работает - так что вот не надо тут разводить.
|
12.05.2011, 16:35 | #6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Рил, у тебя взаимоисключающие параграфы. То тебе надо перебирать порты строго из 1025 до 2049 (заметь, обычно этот диапазон отдают системе, юзверям тут делать нечего), то вдруг теперь ты открыл для себя команду bind(), которая прибиндит тебя к первомому попавшемуся порту (а как же "строго из 1025 до 2049"? уже не строго?), ну или к тому порту, который ты руками задал в SockAddrIn. Где логика? Ещё и споришь со знающим человеком. Для начала запусти TcpView и разберись, куда твой сервер в результате забиндился.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
12.05.2011, 16:58 | #7 | |||
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
Цитата:
Цитата:
Цитата:
|
|||
12.05.2011, 17:37 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> Это ограничение отпало
да уж, "изящное" решение, нечего сказать. Естественно, мы должны были сами догадаться, что ограничение на диапазон с 1025 до 2049 нафиг отпало. > просто теперь пользуюсь любыми портами речь про сервер, я надесь. Было бы интересно взглянуть на код, который назначает порт серверу из SockAddrIn, после того как bind() успешно отработал.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 12.05.2011 в 17:49. |
13.05.2011, 00:43 | #9 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Цитата:
Еще раз повторяю - используя напрямую WinSock ты : 1. Создал ОТДЕЛЬНЫЙ сокет (никак не связанный с сокетом, который создает TServerSocket при его активации, не раньше и не позже !!). 2. Хендл этого сокета ты передал параметром в вызов ф-ции Bind(). Она вернула, к примеру, успех, т.е. порт не занят. 3. Если СРАЗУ после этого ты будешь активировать TServerSocket с указанеим порта, к которому ты в п.2 забиндился, то он пошлет тебя в пень, ибо своим биндом ты занял этот порт. 4. Если перед активацией TServerSocket к этому порту ты вызовешь CloseSocket для того сокета, который ты создал в п.1 чтобы забиндиться к проверяемому порту, то нет НИКАКОЙ ГАРАНТИИ, что в промежуток времени между между CloseSocket() и TServerSocket.Open кто-то кроме тебя не успеет занять только что проверенный тобой на незянятость порт. Знаний-то ноль, а гонору выше крыши) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[?] Доступность компонента Spinedit | Canada | Компоненты Delphi | 1 | 29.03.2011 23:31 |
Можно ли Connect'oм определить доступность Udp порта? | Dasharnb777 | Общие вопросы .NET | 1 | 07.12.2010 00:03 |
Доступность сайта | phphel | Общие вопросы Delphi | 14 | 15.09.2010 08:29 |
Доступность кнопки. | *stRong* | Помощь студентам | 2 | 04.06.2010 03:30 |
Как получить данные с COM-порта или другого любого порта? | DeLure | Общие вопросы C/C++ | 5 | 20.09.2007 00:50 |