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 |