家裏的無線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>