Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];




Вниз

Как найти свободный порт? 


Kornet   (2001-10-08 16:04) [0]

Господа, как можно программно определить любой свободный порт в системе?



PGM   (2001-10-08 22:09) [1]

Какой порт-то? Если TCP/IP, то самый простой способ - сканирование.



Kornet   (2001-10-09 07:23) [2]

Ну если форум о сетевых технологиях, то естественно речь о портах TCP/IP. Мне нужно программно определить любой свободный на данный момент порт. Сканирование будет отнимает дополнительное время. Ведь система для отправки пакетов выбирает свободный порт из диапазона 1024 - 65536 и садится на него. Вот мне надо что то подобное. В системе должна же храниться информация о занятых портах???



PGM   (2001-10-09 10:57) [3]

Порты в сетях бывают не только у TCP/IP, молодой человек.



Digitman   (2001-10-09 10:59) [4]

>Kornet
Речь ведь о сервере идет, я правильно понял ?
Ну найдешь ты своб.порт, ну "сядешь" на него. А клиент-то откуда будет знать, какой порт сервер исп-ет ? Как он (клиент) коннект-то будет осуществлять, если всякий раз при старте сервер "слушает" то один порт, то другой, то третий ? Поясни свое видение сабжа.



PGM   (2001-10-09 11:04) [5]

Посмотри еще функцию GetTcpTable. Вроде то, что надо.



Kornet   (2001-10-09 13:56) [6]

PGM: Спасибо за молодого человека. :) Порты бывают разные, я не спорю, но форум то о сетях, а не о железе или о международных перевозках морским транспортом... А за GetTcpTable спасибо, сейчас посмотрю. :)

Digitman: Лучше наверное сказать что клиент-приложение должно садиться на свободный порт. И коннектиться на заведомо известный. При этом открывается "сессия". Сессия в кавычках, потому что речь идёт о UDP-протоколе. Т.е. клиент-приложение (КП), конектиться к сервер-приложению (СП), и предаёт свои параметры IP:Port, далее дело техники. Но, если СП я могу утверждать что его порт заведомо свободный, а вот за клиентов я ручатся не могу... А хочеться сделать "касиво". :)



Digitman   (2001-10-09 14:11) [7]

Короче, тебе нужен механизм, подобный ICQ.
Тогда действительно тебе необходимо воспользоваться интерфейсом библ-ки IPHLPAPI.DLL, там есть вызовы, решающие твою задачу. См. MSDN



SKiwa   (2001-10-09 14:31) [8]

>Kornet
Искать и садится должен сервер т.к. свободный порт клиента может оказаться занятым для сервера.

>Digitman
Задача вполне имеет место. Для решения описанной тобой проблемы можно сделать так:
1. Сервер запускается
2. Находит свободный порт
3. Садится на него
4. Коннектится к спец серверу по фиксированному порту
5. Сообщает ему Порт и Идентификатор.

1. Клиент запускается
2. Коннектится к спецсерверу
3. Спрашивает его дай мне порт по Идентификатору
4. Коннектится к нужному серверу

Такой спец сервер может фиксировать список активных серверов соответственно их порты адреса и т.д.

Этот подход может иметь интерес хотябы с точки зрения обработки падения сервера и переключения клиента на другой рабочий сервер

Меня этот вопрос тоже интересовал, но я не успел до него добраться, и естественно обратил внимание на эту дискуссию.

>PGM
GetTcpTable - это где? в Help(из поставки Delphi5) я его не нашел.



Digitman   (2001-10-09 14:41) [9]

>SKiwa
Это ты автору объясняй, а не мне)



Wonder   (2001-10-09 14:44) [10]

Чего-то я не пойму.
В описании к ф-ции bind() сказано:

"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..."

Или я не о том?



Kornet   (2001-10-09 14:50) [11]

SKiwa: Минуточку, слишком много текста. :) Говоря клиент-приложение я подразумевал, что оно содержит как клиент-сокет, так и серверный сокет. И мне садиться то надо серверным... А в общем задача точно такая как ты описал... А GetTcpTable находится в библиотеке iphlpapi.dll, так что ли. Вот ищу описание энтой библиотеки...



Kornet   (2001-10-09 14:58) [12]

Wonder: А ведь в этом что то есть, надо попробывать. Я в принципе это и хотел, мне вообще не нужно знать цифру порта, главное что бы он был свободный... А оказывается всё гениальное просто. :)



Digitman   (2001-10-09 15:02) [13]

Вообще-то Wonder, кажется, прав)
Нечего велосипед изобретать - достаточно воспользоваться возможностью bind()
А что касаемо iphlpapi - залезь на http://delphi-jedi.org, там есть это: прототипы, демо-исходники и пр. по этой спецификации. 61кб ZIP



nikkie   (2001-10-09 16:08) [14]

подождите...

For TCP/IP, if the port is specified as zero, the service provider will assign a unique port to the application with a value between 1024 and 5000.

но ведь автор хотел UDP?



Digitman   (2001-10-09 16:16) [15]

>nikkie

UDP - один из гнездовых режимов (socket datagramm protocol)
Также как TCP (одноименный с базовым протоколом режим) - socket stream protocol.

Оба режима, с точки зрения механизма портов, идентичны.
Просто, когда говорят TCP-гнездо, подразумевается не протокол как таковой, а stream-режим, а UDP-гнездо - datagramm-режим



Игорь   (2001-10-26 22:22) [16]

>> что касаемо iphlpapi - залезь на http://delphi-jedi.org

Digitman, не мог бы ты указать конкретную страницу плз.




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.022 c
1-66283           L_Coder               2002-01-04 16:45  2002.01.21  
inline()


4-66412           AlexandrH             2001-11-19 11:20  2002.01.21  
Как получить дескриптор активного окна.


1-66226           ctapik-net            2002-01-02 01:11  2002.01.21  
Загрузка изображения из RES-файла


1-66295           Stupid                2002-01-04 22:22  2002.01.21  
HELPPPP ME


7-66376           Dmitry V. Averuanov   2001-10-08 16:17  2002.01.21  
Освобождение памяти при завершении процесса.