PDA

View Full Version : سوال: تشخیص باز بودن پورت با Indy



Modernidea
شنبه 01 آبان 1389, 22:05 عصر
سلام

میخوام توسط کامپوننت Indy یک آی پی از موجود در اینترنت که یک کامپیوتر شخصی است رو چک کنم ببینم فلان پورتش باز هست یا خیر؟

از کدام کاپوننت و کدام فانکشن ها باید استفاده کنم؟

(دلفی7 - ویندوز xp)
ممنون و موفق باشید.

mehdi_naghous
شنبه 01 آبان 1389, 22:26 عصر
اگه میشه یه توضیح کامل بدید چون که من از indy اطلاعات کامل ندارم
تشکر

مهران رسا
شنبه 01 آبان 1389, 23:24 عصر
سلام

از کنترل IdTCPClient به این صورت استفاده کنید :


var
Res: string;
RandomPort: word;
begin
RandomPort := 8812;
IdTCPClient1.Host := '127.0.0.1';
IdTCPClient1.Port := RandomPort;
try
IdTCPClient1.Connect;
Res := inttostr(RandomPort) + ' is open';
except // Connection refused
Res := inttostr(RandomPort) + ' is not open';
end;
ShowMessage(Res);


(ضمناً باید سوالتون رو در قسمت مربوط به برنامه نویسی شبکه مطرح میکردید)

Felony
یک شنبه 02 آبان 1389, 06:18 صبح
function PortIsOpen(const APort: Integer; const IPAddress: string):
Boolean;
var
LTcpClient: TIdTCPClient;
begin
LTcpClient := TIdTCPClient.Create(nil);
try
try
LTcpClient.Host := AAddress; //which server to test
LTcpClient.Port := APort; //which port to test
LTcpClient.ConnectTimeout := 200; //assume a port to be clodes if it does not respond within 200ms (some ports will immediately reject, others are using a "stealth" mechnism)
LTcpClient.Connect; //try to connect
result := true; //port is open
except
result := false;
end;
finally
freeAndNil(LTcpClient);
end;
end;

استفاده :
if PortIsOpen(1234, '127.0.0.1') then
ShowMessage('OPEN')
else
ShowMessage('NOT OPEN');

Modernidea
یک شنبه 02 آبان 1389, 17:49 عصر
من با دلفی7 کار میکنم و این کامپوننت رو هم ارتقا ندادم.

این خط را

LTcpClient.ConnectTimeout := 200;
به این تبدیل کردم:
1.
LTcpClient.Connect(200);

و این را

LTcpClient.Connect;
به این
2.
LTcpClient.Connected;

اما وقتی فراخوانی میکنم رو خط شماره 2 خطای Connect Time out میده.

مشکل کجاست؟

Felony
یک شنبه 02 آبان 1389, 18:21 عصر
مشکل کجاست؟
مشکلی نیست !
اون پیغام به خاطر Timeout شدن اتصال هست ، شما Continue رو بزن تا نتیجه تابع رو دریافت کنی ، تو IDE دلفی چون در حالت Debug هستی پیغام خطا توسط کامپایلر صادر میشه ، وقتی فایل exe برنامه رو اجرا کنی اون پیغام خطا نشون داده نمیشه .

در واقع در اون کد توسط یک شئ TCPClient ما سعی به اتصال به IP مورد نظر با پورت وارد شده رو داریم ، اگر در زمان مشخص شده این اتصال برقرار نشه توسط try ... except خطای اتفاق افتاده رو کنترل میکنیم و مشخص میکنیم که Port مورد نظر بسته هست .

Mahmood_M
دوشنبه 03 آبان 1389, 02:06 صبح
روش دیگه استفاده از Winsock هست ، به نقل از اینجا (http://theroadtodelphi.wordpress.com/2010/02/21/checking-if-a-tcp-port-is-open-using-delphi-and-winsocks/) ! :
uses
Winsock;

function PortTCP_IsOpen(dwPort : Word; ipAddressStr:AnsiString) : boolean;
var
client : sockaddr_in;
sock : Integer;

ret : Integer;
wsdata : WSAData;
begin
Result:=False;
ret := WSAStartup($0002, wsdata); //initiates use of the Winsock DLL
if ret<>0 then exit;
try
client.sin_family := AF_INET; //Set the protocol to use , in this case (IPv4)
client.sin_port := htons(dwPort); //convert to TCP/IP network byte order (big-endian)
client.sin_addr.s_addr := inet_addr(PAnsiChar(ipAddressStr)); //convert to IN_ADDR structure
sock :=socket(AF_INET, SOCK_STREAM, 0); //creates a socket
Result:=connect(sock,client,SizeOf(client))=0; //establishes a connection to a specified socket
finally
WSACleanup;
end;
end;
حداقلش اینه که با این روش نیازی به Unit های مربوط به Indy نیست و چند کیلوبایتی از فایل نهایی برنامه کم میشه !

تابع موجود در پست 4 رو هم می تونید توی همون لینکی که گذاشتم (http://theroadtodelphi.wordpress.com/2010/02/21/checking-if-a-tcp-port-is-open-using-delphi-and-winsocks/#comment-46) پیدا کنید ، ولی ظاهرا اینجا در نقل قول اشتباه شده ، چون پارامتر ورودی دوم تابع AAddress باید باشه ، نه IPAddress و نکته ی دیگه اینکه چون هدف فقط تست Port هست ، بهتره که قبل از Free شدن IDTCPClient ، اون رو Disconnect کنید ...

موفق باشید ...

InfiniteLoop
چهارشنبه 13 اردیبهشت 1391, 14:51 عصر
یه سوال
time out این winsock چنده رو حالت پیش فرض؟؟ اصلا میشه تغییرش داد؟
یه سوال دیگه
unit های اون source بالاییه که با Indy نوشته شده چه چیزایین؟؟
mer30