UPnP — Википедия

Universal Plug and Play (UPnP) — архитектура многоуровневых соединений между хостами. Обеспечивает автоматическое подключение хостов друг к другу и их совместную работу. Основан на TCP/IP, HTTP, XML и других открытых интернет-стандартах.

Форум Universal Plug and Play (UPnP) — это международная организация, созданная в июне 1999 года с целью разработки и внедрения стандартов технологии UPnP. Основная задача форума заключается в упрощении интеграции интеллектуальных устройств в домашние и корпоративные сети. Участники форума занимаются созданием и публикацией протоколов управления устройствами и службами на основе технологии UPnP.

На начало июня 2001 года в состав Форума UPnP входило более 350 компаний. Руководство деятельностью форума осуществляет Управляющий комитет по UPnP, в состав которого входят 22 члена. В рамках организации также функционируют Технический комитет, Комитет по маркетингу и специализированные рабочие комитеты, занимающиеся различными категориями устройств.

Технические элементы

[править | править код]

Технология UPnP ориентирована на домашние сети, сети малых предприятий и прочие сети компактных размеров. Она обеспечивает обмен данными между любыми двумя устройствами, находящимися под контролем какого-либо управляющего устройства сети. Технология UPnP действует независимо от используемой операционной системы, физической среды передачи данных или языка программирования.

UPnP поддерживает сети нулевой конфигурации и автоматическое обнаружение устройств: устройство присоединяется к сети в динамическом режиме, получает IP-адрес, по запросу сообщает о своих возможностях и собирает информацию о наличии и возможностях других устройств. Присутствие серверов DHCP и DNS необязательно; они могут использоваться только в случае, если будут доступны в сети. Более того, устройство может автоматически выйти из сети, и это не приведёт к каким-либо нарушениям в её работе.

Технология UPnP опирается на весь опыт развития Интернета, в ней активно используются многие его компоненты, в том числе IP, TCP, UDP, HTTP и XML. Проект развития UPnP предусматривает многостороннее сотрудничество заинтересованных компаний в области создания стандартных протоколов управления устройствами (DCP). Как и в случае интернета, эти стандарты будут основываться на протоколах проводного доступа, имеющих декларативный характер, составленных на языке XML и поддерживающих связь через протокол HTTP.

Перенаправление портов

[править | править код]

UPnP позволяет программно перенаправлять порты. Этим пользуются такие приложения, как Skype, μTorrent. Ниже приведён пример использования объекта OLE для осуществления такого перенаправления (код написан на Delphi 7, поддерживается ОС Windows XP Service Pack 2 и выше).

uses   ..., WinSock, ComObj, ActiveX....  //Для свежих версий Delphi вместо юнита "ComObj" добавляйте "OleAuto".  ...  function GetLocalIP: String; //Получить локальный IP-адрес const WSVer = $101; var   wsaData: TWSAData;   P: PHostEnt;   Buf: array [0..127] of Char; begin   Result := '';   if WSAStartup(WSVer, wsaData) = 0 then begin     if GetHostName(@Buf, 128) = 0 then begin       P := GetHostByName(@Buf);       if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);     end;     WSACleanup;   end; end;  procedure AddUPnPEntry(Port: Integer; const Name: ShortString; LAN_IP: string); var   Nat: Variant;   Ports: Variant; begin   if NOT(LAN_IP = '127.0.0.1') then begin     try       Nat := CreateOleObject('HNetCfg.NATUPnP');       Ports := Nat.StaticPortMappingCollection;        if not VarIsClear(Ports) then begin         //do something         //ShowMessage(IntToStr(Ports.Count));         Ports.Add(Port, 'TCP', Port, LAN_IP, True, name);       end;     except on e:Exception do       ShowMessage('An Error occured with adding UPnP Ports. '+e.Message);     end;   end; end;  procedure RemoveUPnPEntry(Port: Integer); var   Nat: Variant;   Ports: Variant; begin   try     Nat := CreateOleObject('HNetCfg.NATUPnP');     Ports := Nat.StaticPortMappingCollection;     Ports.Remove(Port, 'TCP');   except     ShowMessage('An Error occured with removing UPnP Ports. ' +       'Please check to see if your router supports UPnP and ' +       'has it enabled or disable UPnP.');   end; end;  procedure ListUPnPEntry; var   Nat: Variant;   Ports: Variant;   Enum : IEnumVARIANT;   MyPort : OLEVariant;   IntPort, ExtPort : Integer;   Desc, Protocol, IntClient, ExtIP : WideString;   Enabled: Boolean;   iValue: LongWord; begin   try     Nat := CreateOleObject('HNetCfg.NATUPnP');     Ports := Nat.StaticPortMappingCollection;      if not VarIsClear(Ports) then begin       Enum := IUnknown(Ports._NewEnum) as IEnumVARIANT;       while Enum.Next(1, MyPort, iValue) = S_OK do begin         Desc := MyPort.Description;         Enabled := MyPort.Enabled;         ExtIP := MyPort.ExternalIPAddress;         ExtPort := MyPort.ExternalPort;         IntClient := MyPort.InternalClient;         IntPort := MyPort.InternalPort;         Protocol := MyPort.Protocol;         Form1.Memo1.Lines.Add(Desc + ^I + ^I + IntToStr(ExtPort) + ^I + Protocol + ^I + IntToStr(IntPort) + ^I + IntClient);       end;     end;    except     ShowMessage('An Error occured with listing UPnP Ports.Please check to see if your router supports UPnP and has UPnP enabled.');   end; end;  procedure TForm1.Button1Click(Sender: TObject); begin   AddUPnPEntry(8090, 'MyProgram', GetLocalIP); //Добавить порт end;  procedure TForm1.Button2Click(Sender: TObject); begin   RemoveUPnPEntry(8090); //Удалить порт end;  procedure TForm1.Button3Click(Sender: TObject); begin   ListUPnPEntry; //Обновить end; 

В данном примере имя службы задавалось как "MyProgram". Имя службы содержит описание программы для перенаправления порта.

Внешние ссылки

[править | править код]