Форум: "Сети";
Текущий архив: 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