Форум: "Сети";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Внизопределить "свободные" UDP&TCP порты Найти похожие ветки
← →
MetalFan © (2004-07-29 17:36) [0]subj собственно.
заранее спасибо за помощь!
← →
Rouse_ © (2004-07-29 20:44) [1]какова цель?
bind и accept сами дадут тебе свободный порт
← →
Rouse_ © (2004-07-29 21:12) [2]т.е. не bind а connect :)
← →
MetalFan © (2004-07-30 11:18) [3]я использую Indy TCP & Indy UDP серверы! мне нужно запустить их на одинаковых свободных портах в заданном диапазоне!
сорри, если неясно выразился!
← →
panov © (2004-07-30 11:55) [4]ну так запускай сервер и проверяй на ошибку.
← →
MetalFan © (2004-07-30 11:57) [5]ну пока так и делаю...
может есть более красивое решение?
← →
Anatoly Podgoretsky © (2004-07-30 11:57) [6]А что значит свободные, ну запустил ты сервер на 21 порту, а потом фтп сервер, это свободный порт или нет?
← →
panov © (2004-07-30 12:03) [7]Есть такая программа - netstat, можно ей воспользоваться или написать API-аналог.
← →
MetalFan © (2004-07-30 12:18) [8]
> panov © (30.07.04 12:03) [7]
спасибо! забыл как это прога называется! чес слово)
> Anatoly Podgoretsky © (30.07.04 11:57) [6]
> А что значит свободные, ну запустил ты сервер на
простите, может я счас и глупость скажу...
но TCP и UDP протоколы по моему ниже по уровню, чем FTP...
===
в общем у меня задача такая:
есть программа-сервер, есть клиентская часть.
при старте сервера активируются на одном из свободных(одинаковых по номеру) портов Indy UDP и TCP сервера...
при запуске клиента сначала производится broadcast по UDP в некотором диапазоне портов, и затем, если найден сервер, осуществляется соединение по TCP...
соотв. если приходит ответ от UDP сервера с определенного порта, то считается, что там же находиться TCP сервер и к нему пытается присоединиться TCP клиент...
===
вот для чего на сервере мне нужно "занять" одинаковые порты по UDP и TCP.
сейчас на серверном приложении делаю поиск свободных примерно портов так:
...
FIdServer := TIdUDPServer.create(nil);
...
function GetPort: Integer;
var
lFound: Boolean;
lTCPServ: TIdTCPServer;
begin
Result := C_BROADCASTBSP;
lTCPServ := TIdTCPServer.Create(nil);
try
repeat
if FIdServer.Active then
FIdServer.Active := false;
if lTCPServ.Active then
lTCPServ.Active := false;
lFound := True;
try
FIdServer.DefaultPort := Result;
FIdServer.Active := True;
lTCPServ.DefaultPort := result;
lTCPServ.Active := true;
except
Inc(Result);
lFound := False;
end;
if Result = C_BROADCASTESP then
Break;
until lFound;
lTCPServ.Active := false;
finally
lTCPServ.Free;
end;
end;
можно как нибудь по-красивее / по быстрее это реализовать?
← →
False_Delirium © (2004-07-30 12:59) [9]
try
FIdServer.DefaultPort := Result;
FIdServer.Active := True;
lTCPServ.DefaultPort := result;
lTCPServ.Active := true;
except
Inc(Result);
lFound := False;
end;
Не то что в этой программе, так вообще нельзя делать, никогда.
У тебя при любом исключении переходит в except блок.
Для чего тебе целый lTCPServ, не проще создать для проверки сервер на API, bind пока жет тебе результат.
Result := C_BROADCASTBSP;
lTCPServ := TIdTCPServer.Create(nil);
try
repeat
try
...
except
Inc(Result);
lFound := False;
end;
if Result = C_BROADCASTESP then
Break;
until lFound;
На лицо вероятность бесконечного цикла.:)
← →
MetalFan © (2004-07-30 14:07) [10]а можно мааленький примерчик?!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.063 c