Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2011, 18:42   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание Доступность порта

Есть TServerSocket и TClientSocket. Нужно проверить доступность порта(а вдруг он занят? ). Перебор портов начинается с 1025 до 2049, далее можно не проверять. Как?
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.05.2011, 21:37   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Для сервера - в цикле пытайся активировать его на очередном проверяемом порту, с контролем соотв. отказов.
Для клиента - бессмысленная проверка.
mss вне форума Ответить с цитированием
Старый 12.05.2011, 15:13   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Нашёл другое решение, поизящнее:
Код:
var SockAddrIn : TSockAddrIn;
    FSocket    : TSocket;

  ...

  If  bind(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> 0 Then
  begin
    обрабатываем WSAGetLastError
  end;
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.05.2011, 16:01   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Нашёл другое решение, поизящнее:
Ну вызвал ты бинд, занял порт при этом.
Далее ты активируешь TServerSocket и он обламывается, потому что в ходе активации он вызывает тот же самый бинд для порта, который ты перед этим занял явным биндом.

А для клиента бинд нафих не нужен.
mss вне форума Ответить с цитированием
Старый 12.05.2011, 16:23   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

mss, я протестил, работает - так что вот не надо тут разводить.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.05.2011, 16:35   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Рил, у тебя взаимоисключающие параграфы. То тебе надо перебирать порты строго из 1025 до 2049 (заметь, обычно этот диапазон отдают системе, юзверям тут делать нечего), то вдруг теперь ты открыл для себя команду bind(), которая прибиндит тебя к первомому попавшемуся порту (а как же "строго из 1025 до 2049"? уже не строго?), ну или к тому порту, который ты руками задал в SockAddrIn. Где логика? Ещё и споришь со знающим человеком. Для начала запусти TcpView и разберись, куда твой сервер в результате забиндился.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.05.2011, 16:58   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
То тебе надо перебирать порты строго из 1025 до 2049 (заметь, обычно этот диапазон отдают системе, юзверям тут делать нечего)
Это ограничение отпало, просто теперь пользуюсь любыми портами.
Цитата:
Ещё и споришь со знающим человеком.
Знающим? Маловероятно.
Цитата:
Рил,
Учи английский. Во-первых, real читается как "риал"(естественно, со всякими английскими призвуками), а в моём случае - "Реал".
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.05.2011, 17:37   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Это ограничение отпало

да уж, "изящное" решение, нечего сказать. Естественно, мы должны были сами догадаться, что ограничение на диапазон с 1025 до 2049 нафиг отпало.

> просто теперь пользуюсь любыми портами

речь про сервер, я надесь. Было бы интересно взглянуть на код, который назначает порт серверу из SockAddrIn, после того как bind() успешно отработал.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 12.05.2011 в 17:49.
veniside вне форума Ответить с цитированием
Старый 13.05.2011, 00:43   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
не надо тут разводить
Что ж ты за бестолочь-то, а ?)

Еще раз повторяю - используя напрямую WinSock ты :
1. Создал ОТДЕЛЬНЫЙ сокет (никак не связанный с сокетом, который создает TServerSocket при его активации, не раньше и не позже !!).
2. Хендл этого сокета ты передал параметром в вызов ф-ции Bind(). Она вернула, к примеру, успех, т.е. порт не занят.
3. Если СРАЗУ после этого ты будешь активировать TServerSocket с указанеим порта, к которому ты в п.2 забиндился, то он пошлет тебя в пень, ибо своим биндом ты занял этот порт.
4. Если перед активацией TServerSocket к этому порту ты вызовешь CloseSocket для того сокета, который ты создал в п.1 чтобы забиндиться к проверяемому порту, то нет НИКАКОЙ ГАРАНТИИ, что в промежуток времени между между CloseSocket() и TServerSocket.Open кто-то кроме тебя не успеет занять только что проверенный тобой на незянятость порт.

Знаний-то ноль, а гонору выше крыши)
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[?] Доступность компонента 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