Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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, не мог бы ты указать конкретную страницу плз.



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

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

Наверх




Память: 0.48 MB
Время: 0.003 c
3-66187
Atrem
2001-12-16 16:08
2002.01.21
Что за ошибка и как ее исправить ???


3-66205
fishka
2001-12-18 12:10
2002.01.21
Поле типа Identity - как задать значение, с которого начинать нумерацию?


4-66396
Jurgen
2001-11-19 18:46
2002.01.21
Переключение раскладки в Win3.11


1-66305
Yuraz
2002-01-04 15:05
2002.01.21
Как отменить это свойство Font.Style:=


1-66290
VadX
2002-01-03 21:22
2002.01.21
Окно программы....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский