![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
определить "свободные" UDP&TCP порты [D6, Win95/98, Win2k, WinXP]
MetalFan © (2004-07-29 17:36:00)subj собственно.
заранее спасибо за помощь!
MetalFan (2004-07-30 14:07:00) [1]а можно мааленький примерчик?!
False_Delirium (2004-07-30 12:59:00) [2]
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 12:18:00) [3]
> 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;
можно как нибудь по-красивее / по быстрее это реализовать?
panov (2004-07-30 12:03:00) [4]Есть такая программа - netstat, можно ей воспользоваться или написать API-аналог.
MetalFan (2004-07-30 11:57:00) [5]ну пока так и делаю...
может есть более красивое решение?
Anatoly Podgoretsky (2004-07-30 11:57:00) [6]А что значит свободные, ну запустил ты сервер на 21 порту, а потом фтп сервер, это свободный порт или нет?
panov (2004-07-30 11:55:00) [7]ну так запускай сервер и проверяй на ошибку.
MetalFan (2004-07-30 11:18:00) [8]я использую Indy TCP & Indy UDP серверы! мне нужно запустить их на одинаковых свободных портах в заданном диапазоне!
сорри, если неясно выразился!
Rouse_ (2004-07-29 21:12:00) [9]т.е. не bind а connect :)
Rouse_ (2004-07-29 20:44:00) [10]какова цель?
bind и accept сами дадут тебе свободный порт