Herkese merhabalar,
Bugün sizlere yakında elveda diyeceğim bir tekniği tanıtacağım. Bu teknik sizin Client-Server mantığında oluşturmuş olduğunuz projeler için bir port açıcı görevi görüyor diyebiliriz.
⚠️ Peki bu tekniğe neden elveda diyorum?
Tekniğe elveda dememin sebebi şudur ki; tüm modemlerde desteği bulunmaması bu açıdan bazı bilgisayarlarda problem çıkartıyor olabilmesidir.
⚠️ Peki bu teknik nedir?
UPnP olarak bilinen, açılışı "Universal Plug & Play" olarak adlandırılan bir iletişim aracı diyebiliriz.
ℹ️ Google amcanın tanımı ile;
UPnP, Universal Plug&Play'in kısaltması. Evrensel Tak&Çalıştır adı verilen teknoloji sayesinde birçok elektronik cihaz kolayca birbiriyle uyumlu çalışabilir hale gelmektedir. Elektronik cihazlar bağlantı özelliği kazansa bile standart haberleşme protokolleri kullanmadığı sürece birbiriyle uyumlu çalışamazlar.
Tanımının yeterli olduğunu düşünüyorum bu sebeple sizlere Delphi ile nasıl kullanacağımız hakkında biraz bilgi vereyim.
1) UPnP.pas dosyasını tanıyalım
UPnP.pas bir sınıf yapılı dosyadır. Bu sınıfı Delphi ile kullanarak en azından benim modem için uyumlu olduğundan dolayı birkaç deneme yapabiliriz.
⚠️ UPnP.pas dosya içeriği;
unit UPnP; ///Türkçe Çeviri: Halil Han Badem
interface
uses
Windows, ActiveX, OleAuto, Variants, SysUtils;
type
PortAcmak = class
public
class function Ekle(const Aktiflik: Boolean; const CikisPort, GirisPort: DWORD;
const IPAdresi, Protokol, Aciklama: String): Boolean;
class function Kaldir(const CikisPort: DWORD; const Protokol: String): Boolean;
end;
implementation
class function PortAcmak.Ekle(const Aktiflik: Boolean; const CikisPort, GirisPort: DWORD;
const IPAdresi, Protokol, Aciklama: String): Boolean;
var
n, p: Variant;
Begin
Result := False;
try
n := CreateOleObject('HNetCfg.NATUPnP');
p := n.StaticPortMappingCollection;
if not VarIsClear(p) then
begin
p.Add(CikisPort, UpperCase(Protokol), GirisPort, IPAdresi, Aktiflik, Aciklama);
Result := True;
end;
except
// on e: exception do showmessage(e.Message);
end;
end;
class function PortAcmak.Kaldir(const CikisPort: DWORD; const Protokol: String): Boolean;
var
n, p: Variant;
Begin
Result := False;
try
n := CreateOleObject('HNetCfg.NATUPnP');
p := n.StaticPortMappingCollection;
if not VarIsClear(p) then
Result := p.Remove(CikisPort, UpperCase(Protokol)) = S_OK;
except
// on e: exception do showmessage(e.Message);
end;
end;
end.
İster indirebilir isterseniz de direkt burdan kodları alabilirsiniz. Geçmişte can sıkıntısından class isimlerini ve değişken isimlerini Türkçeye çevirmiştim 🙂
NOT: Aşağıdaki aşamaları yapmadan önce UPnP.pas dosyasını projenize eklemeyi unutmayınız
uses
...
UPnP;
Bundan sonra altta bulunan kodlar ile portu açabilirsin. Tabi bu port program açık kalana kadar, kapandığı an port disable olur.
procedure TUPnPFRM.Button1Click(Sender: TObject);
begin
if not PortAcmak.Kaldir(4232, 'TCP') then // aynı port varsa kaldırır, var olupta kaldıramazsa sorun belirtir.
ShowMessage('Aynı porttan mevcut!');
if not PortAcmak.Ekle(True, 4232, 4232, '192.168.1.37', 'TCP', 'DelphiCanDenemePortu') then // gerekli bilgilendirmeler yapılıyor.
ShowMessage('Port açılırken hata oluştu!');
end;
Deneme amaçlı bir Server Socket ile 4232 numaralı port üzerinde denememi yaptım;

Kaynak kodlarını github adresimde bulabilirsiniz.
Github UPnP Projesi: Tıklayın!
Umarım bu yazım yardımcı olmuştur, herkese iyi forumlar.
Saygılarımla,
İyi çalışmalar 🤟