首頁 >php教程 >php手册 >在php上使用fork以及socket的sample

在php上使用fork以及socket的sample

WBOY
WBOY原創
2016-06-13 10:34:461608瀏覽

最近剛好遇到一個頭大的問題寫了這個code讓大家參考一下吧
家裏的無線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>//這是Child Process的訊息處理函數<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>//Child Process收到結束的訊息<br>    </font><font color="#0000bb">DestroySocket</font><font color="#007700">&</font></font><font face="NSimsun"><font color="#ff8000">#40;); //關閉Socket<br>    </font><font color="#007700">exit&</font></font><font face="NSimsun"><font color="#ff8000">#40;0); //結束Child Process<br>   </font><font color="#007700">default&</font></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">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>  //Child Process Socket處理函數<br>  //$ConnectedServerSocket -> 外部連進來的Socket<br>  </font><font color="#007700">global</font><font color="#0000bb">$ServerSocket</font><font color="#007700">,</font><font color="#0000bb">$RemoteSocket</font><font color="#007700">,</font><font color="#0000bb">$IP</font><font color="#007700">,</font><font color="#0000bb">$Port</font></font><font face="NSimsun"><font color="#007700">;<br>  </font><font color="#0000bb">$ServerSocket</font><font color="#007700">=</font><font color="#0000bb">$ConnectedServerSocket</font></font><font face="NSimsun" color="#007700">;<br>  declar						
</font></font>

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn