Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Вниз

Как посмотреть - не занят ли порт?   Найти похожие ветки 

 
interier   (2002-03-22 10:50) [0]

Для программы, использующей ServerSocket рекомендуют использовать
порты выше 1024. Как определить - не занят ли уже данный порт какой-либо программой, пользующей клиентский или серверный Socket?


 
Wonder   (2002-03-22 11:00) [1]

А зачем? Если только для того, чтобы создать этот самый сокет, то и не задумывайся даже. Ставь порт = 0 и WinSock сам за тебя выберет свободный порт.

If the port is specified as 0, the Windows Sockets implementation will assign a unique port to the application with a value between 1024 and 5000. The application may use getsockname() after bind() to learn the address that has been assigned to it.


 
Digitman   (2002-03-22 11:57) [2]

>interier
Все это чУдно, конечно, только вот как клиенты твои будут знать о том, какой порт для "прослушивания" выбрал на сей момент сервер ?)


 
yaJohn   (2002-03-22 12:31) [3]

Это уже второй вопрос ;) Ответ на него не раз обсуждался в форуме, но искать не стоит, однозначного ответа нет. Могу предложить сканер портов ;)))
А вот узнать занят порт или нет очень просто. Попытаться его открыть. Если порт занят - вывалится ошибка ;)))
try
Server.Active:=true;
except
ShowMessage(":(");
end;


 
interier   (2002-03-22 17:18) [4]

К сожалению сканер портов не определит, если этот порт занял клиент, например TELNET. То есть программа сервера раздает последовательный порт по TCP/IP, по какому-то определенному порту. Некий другой компутер , зная логин и пассворд, подключается и начинает работать с компортом через TCP/IP. В настройках и , опять же для клиента, необходимо указать адрес, порт, логин и пассворд. Но система может отдать порт какой-либо другой программе. Либо какая-то другая программа может захотеть использовать этот порт.
Комбинация
TRY ServerSocket.Open;
EXCEPT ShowMessage(());
в данном случае не помогает - ошибка вышибает до EXCEPTа и выглядит это очень некрасиво..
Сканировать порт тоже не очень помогает - TELNET не видно, и время уходит много - больше секунды.


 
Digitman   (2002-03-22 17:32) [5]

что-то каша какая-то) COM-порт откуда-то взялся, логин туда же с пассвордом ... ни к селу ни к городу как бы ...

мы вообще о чем говорим-то ? о том, как активизировать TServerSocket для "прослушивания" запросов на вх.соединения на первом же найденном (алгоритмически !) свободном порту ? или - о чем ?


 
yaJohn   (2002-03-22 17:33) [6]

Тут есть много вопросов. Ну например какое отношение TCP-IP имеет к последовательному порту и компорту?
Далее. Клент порт занять не может (в контексте сабжа).
Сканировать порт - это как? И где должно быть видно телнет.
С трай-екзепт возможно я напутал, пардон. Надо обрабатывать OnError сервера и выставлять ErrorCode:=0. Я предпочитаю делать и то и другое. Если после попытки открыть порт ServerSocket.Active - порт наш. Если ServerSocket.Active=false - нас опередили.


 
interier   (2002-03-23 17:40) [7]

2Digitman Дело состоит в том, чтобы на одном из компьютеров запустить ServerSocket на конкретный порт. Конкретный порт теоретически уже может быть занят каким-либо : либо клиентским сокетом(например TELNETом, который может зацепиться за любой порт) ,либо на этот порт может зацепиться любой другой серверный сокет.
Поэтому необходимо предварительно определить - свободен ли данный конкретный порт в этом компьютере или нет.

2yaJohn К сожалению из-за непонятно чьей кривости дело до события OnError не доходит. Программа при попытке занять уже занятый порт вылетает на ошибку 10048 WSAEAddrInUse. НО!!!
Попытки определить занятость через API типа socket & bind что-то мне не удалась - занятый порт(если он не объявленый в списке, как тот же ftp) не определяется занятым. Вот мне и надо какой-нибудь корректный способ спросить, а не занят ли порт?, перед использованием его. Даже если у меня компонент кривоватый - то должен быть такой способ, ведь ошибка 10048 возникает, только сымитировать и перехватить ее раньше мне не удается.


 
interier   (2002-03-26 12:39) [8]

Понял! Собака порылась в том, что проверку "bind"ом надо проводить не на INADDR_LOOPBACK (127.0.0.1), а на адресе INADDR_ANY (0.0.0.0). Тогда все получается. Может кому пригодится...


 
Digitman   (2002-03-26 12:45) [9]

>interier
Ну, "сел" твой сервер на первый же найденный незанятый порт. Клиентов-то как ты извещать собираешься о том, на каком порту их сервер "ждет" ?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
8-18072
дикое Кенгуру
2002-01-20 08:19
2002.06.06
Можно пример, как использовать Direct Sound в Дельфи ? Загрузить, прослушать, поменять параметры.


4-18201
Flash X!
2002-04-05 19:45
2002.06.06
Каое событие происходит когда я убираю мышку с формы?


4-18183
Sender
2002-04-02 18:42
2002.06.06
ПОМОГИТЕ!!!


1-17856
viper_m
2002-05-26 03:38
2002.06.06
окно Ontop


14-18124
SPeller
2002-04-30 00:20
2002.06.06
К тем, кто знает Яву





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский