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