PHP でのフォークとソケットの使用に関する Sample_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:36:03
オリジナル
872 人が閲覧しました

最近剛好遇到一個頭大的問題寫了這個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&#41;<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&#41;<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&#41;<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&#41;;<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&#41;;<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;&#41;;<BR>    </FONT><FONT color=#007700>exit&</FONT></FONT><FONT face=NSimsun color=#ff8000>#40;0&#41;; //結束主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&#41;; //將$PID清空,表示Child Process已經結束<BR>    </FONT><FONT color=#0000bb>pcntl_wait</FONT><FONT color=#007700>&</FONT></FONT><FONT face=NSimsun color=#ff8000>#40;$Status&#41;; //避免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&#41;<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&#41;<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;&#41; //ソケットを閉じる</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&#41;<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>tru​​e<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>
ログイン後にコピー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!