家裏的無線AP功能不太好,他只提供把外部真實IP map 到 Nat裡面的某個IP
不能指定某個port map到某個內部IP的Port
可是我已經把外部的IP Map到內部的Linux);" href="javascript:;" target=_self>Linux Server上,
但是我又想從外部使用VNC連到內部的一台Windows電腦。
所以就寫了這個程式
原理是這樣
這個程式會在Linux Server上開一個Port作Listen的動作
當外部連到這個Port時,程式會再開啟另一個連線連到內部Windows的VNC上
把外部的封包原封不動的丟到VNC的連線上,然後把VNC連線傳回的資料原封不動的再丟回外部的Port
<br><font face="NSimsun">#!/usr/bin/php -q<br></font><font color="#000000"><font face="NSimsun"><font color="#0000bb"><?php<BR> $IP</FONT><FONT color=#007700>=</FONT><FONT color=#dd0000>192.168.1.1</FONT><FONT color=#007700>;</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>//Windows電腦的IP<BR> </FONT><FONT color=#0000bb>$Port</FONT><FONT color=#007700>=</FONT><FONT color=#dd0000>5900</FONT><FONT color=#007700>; </FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>//VNC使用的Port<BR> </FONT><FONT color=#0000bb>$ServerPort</FONT><FONT color=#007700>=</FONT><FONT color=#dd0000>9999</FONT><FONT color=#007700>;</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>//Linux Server對外使用的Port<BR> </FONT><FONT color=#0000bb>$RemoteSocket</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>false</FONT><FONT color=#007700>;</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>//連線到VNC的Socket<BR> </FONT><FONT color=#007700>function</FONT><FONT color=#0000bb>SignalFunction</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$Signal)<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#123;<BR> //這是主Process的訊息處理函數<BR> </FONT><FONT color=#007700>global</FONT><FONT color=#0000bb>$PID</FONT><FONT color=#007700>;</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>//Child Process的PID<BR> </FONT><FONT color=#007700>switch &</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$Signal)<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#123;<BR> </FONT><FONT color=#007700>case</FONT><FONT color=#0000bb>SIGTRAP</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#58;<BR> </FONT><FONT color=#007700>case</FONT><FONT color=#0000bb>SIGTERM</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#58;<BR> //收到結束程式的Signal<BR> </FONT><FONT color=#007700>if&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$PID)<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#123;<BR> //送一個SIGTERM的訊號給Child告訴他趕快結束掉嘍<BR> </FONT><FONT color=#0000bb>posix_kill</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$PID,SIGTERM);<BR> //等待Child Process結束,避免zombie<BR> </FONT><FONT color=#0000bb>pcntl_wait</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$Status);<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#125;<BR> //關閉主Process開啟的Socket<BR> </FONT><FONT color=#0000bb>DestroySocket</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;);<BR> </FONT><FONT color=#007700>exit&</FONT></FONT><FONT face=NSimsun color=#ff8000>#40;0); //結束主Process<BR> </FONT><FONT face=NSimsun><FONT color=#007700>break;<BR> case</FONT><FONT color=#0000bb>SIGCHLD</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#58;<BR> /*<BR>當Child Process結束掉時,Child會送一個SIGCHLD訊號給Parrent<BR>當Parrent收到SIGCHLD,就知道Child Process已經結束嘍 ,該做一些<BR>結束的動作*/<BR> </FONT><FONT color=#007700>unset&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$PID); //將$PID清空,表示Child Process已經結束<BR> </FONT><FONT color=#0000bb>pcntl_wait</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun color=#ff8000>#40;$Status); //避免Zombie<BR> </FONT><FONT face=NSimsun color=#007700>break;<BR> default&</FONT><FONT face=NSimsun><FONT color=#ff8000>#58;<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#125;<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#125;<BR> </FONT><FONT color=#007700>function</FONT><FONT color=#0000bb>ChildSignalFunction</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#40;$Signal)<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun><FONT color=#ff8000>#123;<BR>//これは子プロセスのメッセージ処理関数です <BR> </FONT><FONT color=#007700>switch &</FONT></FONT><FONT face=NSimsun>#40;$Signal)<FONT color=#ff8000> <BR></FONT>&<FONT color=#007700></FONT></FONT><FONT face=NSimsun>#123;<FONT color=#ff8000> <BR></FONT>case<FONT color=#007700></FONT>SIGTRAP<FONT color=#0000bb> </FONT>&<FONT color=#007700> </FONT> </FONT><FONT face=NSimsun> <FONT color=#ff8000><BR>#40;) //ソケットを閉じる</FONT> ; <FONT color=#007700>#125;</FONT><FONT color=#0000bb></FONT>&<FONT color=#007700></FONT></FONT><FONT face=NSimsun>#125;<FONT color=#ff8000> <BR><BR>function</FONT><FONT color=#0000bb>ProcessSocket</FONT><FONT color=#007700>&</FONT> </FONT><FONT face=NSimsun><FONT color=#ff8000>#40 ;$ConnectedServerSocket)<BR> </FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun> <FONT color=#ff8000>#123;<BR> //子プロセスソケット処理関数 </FONT> //$ConnectedServerSocket -> 外部接続ソケット<font color="#007700"></font>グローバル</font><font face="NSimsun">$ServerSocket <font color="#ff8000"><br>、</font><font color="#007700">$ RemoteSocket</font></font>,<font face="NSimsun"><font color="#ff8000">$IP<br></font>,<font color="#007700"></font>$ Port</font><font face="NSimsun"><font color="#ff8000"><br>;</font> <font color="#007700"></font> $ServerSocket<font color="#0000bb"></font>=<font color="#007700"></font>$ConnectedServerSocket</font><font face="NSimsun"><font color="#ff8000">;<br> 宣言</font> <font color="#007700"></font></font>http://www.bkjia.com/PHPjc/508267.html<font face="NSimsun"><font color="#ff8000">www.bkjia.com<br><br>true<br></font>http://www.bkjia.com/PHPjc/508267.html<font color="#007700"></font>技術記事<font color="#0000bb"></font>最近大きな問題が発生したので、参考までにこのコードを書きました。自宅のワイヤレス AP 機能は、外部の実際の IP を Nat の特定の IP にマッピングする機能しか提供していません。 .<font color="#007700"></font><font color="#0000bb"></font> <font color="#007700"></font></font></font></font>