Visual C++로 작성 된 http://ryulib.tistory.com/287 소스에 대한 델파이 버전입니다. 공유기가 UPnP를 지원 할 경우, 코딩으로 포트 포워딩을 해주는 유닛입니다.
[그림 1] 실행 결과
유닛 소스
필요한 DLL
DLL에 대한 소스 (VC++)
사용법 (예제)
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
| 소스코드에서 문자열만 검색하기 (0) | 2014.10.07 |
|---|---|
| A simple Delphi class for parallel processing. (4) | 2013.11.20 |
| Class To DLL - 델파이 클래스를 Dll로 포팅해주는 프로그램 (0) | 2013.07.14 |
| LZMA for Delphi (0) | 2013.01.21 |
| LazyRelease - 메모리 해제를 뒤로 미루기 (0) | 2012.10.21 |