Visual C++로 작성 된 http://ryulib.tistory.com/287 소스에 대한 델파이 버전입니다.  공유기가 UPnP를 지원 할 경우, 코딩으로 포트 포워딩을 해주는 유닛입니다.


[그림 1] 실행 결과




유닛 소스


http://goo.gl/PVIWTs




필요한 DLL


libPortForward.7z




DLL에 대한 소스  (VC++)


libPortForward.7z




사용법 (예제)

unit _fmMain;

interface

uses
  PortForward,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TfmMain = class(TForm)
    Panel1: TPanel;
    moMsg: TMemo;
    btOpen: TButton;
    btOpenUsingThread: TButton;
    procedure btOpenClick(Sender: TObject);
    procedure btOpenUsingThreadClick(Sender: TObject);
  private
    procedure do_WM_SetPortForwarding(var AMsg:TMessage); message WM_SetPortForwarding;
  public
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

procedure TfmMain.btOpenClick(Sender: TObject);
var
  iErrorCode, ExternalPort : integer;
begin
  ExternalPort := 658;

  iErrorCode := SetPortForwarding( '192.168.10.13', 'Ryu', 658, ExternalPort );

  moMsg.Lines.Add( Format('iErrorCode=%d, , ExternalPort=%d', [iErrorCode, ExternalPort]) );
end;

procedure TfmMain.btOpenUsingThreadClick(Sender: TObject);
begin
  SetPortForwarding( Handle, '192.168.10.13', 'Ryu', 658, 658 );
end;

procedure TfmMain.do_WM_SetPortForwarding(var AMsg: TMessage);
begin
  moMsg.Lines.Add( Format('iErrorCode=%d, , ExternalPort=%d', [AMsg.WParam, AMsg.LParam]) );
end;

end.

6: 라인과 같이 PortForward 유닛을 추가합니다.


19: 라인은 비동기 식으로 처리 결과를 받고자 할 때 필요합니다.  함수를 호출하고 바로 결과를 얻고자 할 때는 필요 없습니다.  다만, 함수를 호출하고 바로 결과를 얻고자 할 때는 결과를 오랫 동안 기다려야 하는 경우도 발생합니다.


36: 라인에서는 SetPortForwarding 함수를 이용해서 '192.168.10.13' 주소의 내부 포트 658을 공유기의 외부 포트 658로 포워딩 해줍니다.  iErrorCode가 0 이면 성공이고 이외의 숫자는 모두 실패를 뜻 합니다.


43: 라인에서는 유사항 동작을 스레드를 이용해서 비동기식으로 결과를 알아옵니다.  결과는 메시지를 통해서 Handle 을 가지고 있는 객체에게 전달 됩니다.


48: SetPortForwarding의 결과가 메시지로 전달 되었습니다.  WParam에는 에러 코드가, LParam에는 실제 오픈 된 외부 포트가 전달 됩니다.


공유기의 외부 포트 658을 요청했다고 해도 반드시 658일 오픈되지는 않습니다.  이미 다른 곳에서 사용 중이라면 다른 포트가 오픈됩니다.



예제 전체 소스:   http://goo.gl/djcJtu






Posted by 류종택


티스토리 툴바