Merhabalar,
Windows'un kendi servislerinden bazıları, bilgisayar açıldığında rastgele boş olan bir port seçiyor. Ve eğer bu port sizin uygulamanızda kullandığınız port ise tabi windows amca bu port zaten başka uygulama tarafından kullanımda diyor ama kim kullanıyor söylemiyor.
Aynı şekilde Delphi uygulamanızda da port kullanmak isterseniz bu uyarıyı veriyor.
Bu portu kim kullanıyor Kolayca tespit edebilmek için,
cmd konsolumuza aşağıdaki kodu yazıp çalıştırıyorsunuz ve bize bir işlem id'si veriyor. Bu id ile de görev yöneticisinden görebiliriz.
netstat -npano TCP | find "1229"
Saygılar.
Paylaşım için teşekkürler.
Ben de bunun "Delphice"sini yazayım
Burada daha önce bahsettiğim
iphlpapi.dll içindeki GetExtendedTcpTable APIsi PC'de kullanılan portları tespit etmemizi sağlar. Yine aynı linkte paylaştığım örnek kodlarda çok az değişiklik yapılarak basit bir şekilde hangi portların kullanıldığını ve bu portları kullanan programların isimlerini şöyle tespit edebiliriz:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
dllHandle : THandle;
GetExtendedTcpTable: function(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall;
PID, TableSize: DWORD;
Snapshot: THandle;
FExtendedTcpTable : PMIB_TCPTABLE_OWNER_PID;
AppName: string;
Port: Cardinal;
begin
dllHandle := LoadLibrary('iphlpapi.dll'); //DLL'i hafızaya yükle
if dllHandle = 0 then Exit;
GetExtendedTcpTable := GetProcAddress(dllHandle, 'GetExtendedTcpTable');
if not Assigned(GetExtendedTcpTable) then Exit; // Kullanmak istediğimiz API bu DLLde yok ise çık
Memo1.Lines.BeginUpdate;
Memo1.Lines.Clear;
try
TableSize := 0;
if GetExtendedTcpTable(nil, @TableSize, False, AF_INET, 5, 0) <> ERROR_INSUFFICIENT_BUFFER then //API'yi kullanmak için hafızada ne kadar yere ihtiyaç duyacağız? TableSize bunu bize verecek
Exit; // Hafızada yeterli yer yok ise çık
try
GetMem(FExtendedTcpTable, TableSize);
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if GetExtendedTcpTable(FExtendedTcpTable, @TableSize, TRUE, AF_INET, 5, 0) = NO_ERROR then
for i := 0 to FExtendedTcpTable.dwNumEntries - 1 do
begin
PID := FExtendedTcpTable.Table[i].dwOwningPid;
AppName := GetPidName(SnapShot, PID); // TCP bağlantı yapmış olan uygulamanın adı
Port := FExtendedTcpTable.Table[i].dwLocalPort; // Uygulamanın kullandığı port
Memo1.Lines.Add(Format('%s [%d]', [AppName, Port]));
end;
finally
FreeMem(FExtendedTcpTable);
end;
finally
Memo1.Lines.EndUpdate;
end;
end;
Dipçe: UDP ile kullanılan portları tespit etmek için aynı yöntemi GetExtendedUdpTable APIsi ile kullanmak gerekir.
Her iki yöntem içinde teşekkürler.