在網路中資料傳播分為:unicast(單播) , multicast(多播或者組播) 和 broadcast(廣播)。廣播和多播僅應用於udp,它們對需將報文同時傳往多個接收者的應用來說十分重要。而 tcp 是乙個面向連線的協議,它意味著分別執行於兩主機(由ip位址確定)內的兩程序(由埠號確定)間存在一條連線。廣播位址在預設情況下是不能讓路由器**到別的介面的,廣播不能穿越路由器。廣播有以下幾種形式:
受限的廣播位址是255.255.255.255,該位址用於主機配置過程中ip資料報的位址,此時,主機可能還不知道它所在網路的網路掩碼,甚至連它的ip位址也不知道。在任何情況下,路由器都不**目的位址為受限廣播位址的資料報,這樣的資料報只出現在本地網路中。
指向網路的廣播位址是主機號全為1的位址,a類網路廣播位址為netid.255.255.255,其中netid為a類網路的網路號。
指向子網的廣播位址是主機號全為1的位址,作為子網直接廣播的ip位址需要知道子網的掩碼。如果b類網路128.1的子網掩碼是255.255.255.0,則位址128.1.2.255就是對應子網的廣播位址。
指向所有子網的廣播也需要知道目的網路的子網掩碼。這些廣播位址的子網號和主機號全為1。如果目的子網掩碼是255.255.255.0,那麼ip位址128.1.255.255就是乙個指向所有子網的廣播位址。
php socket 也能實現廣播。在 socket 通訊中,實現連線的伺服器與客戶端需要繫結同一埠號,埠號表示傳送和接收的程序。下面是乙個用 php 實現的簡單的廣播通訊例子,同時採用 php 和 c 語言作為客戶端進行測試:
<?php # script -- broadcast.php
/* author @ huoty
* date @ 2015-11-17 09:58:25
* brief @
*//* 建立廣播事件 */
function broadcast() socket_close($sock); //關閉 } /* 建立守護程序 */ $pid = pcntl_fork(); if ($pid < 0) else if ($pid > 0) else /* 改變工作目錄為根目錄 */ chdir("/"); broadcast(); } ?>
<?php # script -- client.php
/* author @ huoty
* date @ 2015-11-17 09:58:25
* brief @
*///error_reporting( e_all );
set_time_limit( 0 ); ob_implicit_flush(); $socket = socket_create( af_inet, sock_dgram, sol_udp ); if ( $socket === false ) $ok = socket_bind( $socket, '255.255.255.255', 12345 ); if ( $ok === false ) while ( true ) ?>
/* client.c */
#include #include #include #include #define maxline 80
#define serv_port 12345
int main(int argc, char *ar**) close(sockfd); return 0; }
通常,廣播是需要長時間進行的任務,所以可以建立乙個守護程序來完成廣播,以避免程式長時間執行對控制終端的占用。如果不使用守護程序,也可以用 linux 的nohup
命令來實現。然而,php 的程序控制不能被應用在 web 伺服器環境。那麼,要讓 php 的程序控制在 web 環境下得到應用,可以用乙個迂迴的辦法,即用cli
的方式執行包含程序控制的 php 檔案,所謂 cli 方式是指 shell 的執行方式。還有乙個需要注意的問題是,在 web 環境下,由於 php 程式是乙個死迴圈,程式一直執行,所以客戶端總是得不到伺服器的返回結果。為解決這個問題,可以將用&
讓程式在後台執行,同時將輸出重定向到/dev/null
。於是可以建立了乙個新檔案以保證廣播在 web 伺服器環境下能夠被觸發:
<?php # script -- startup.php
/* author @ huoty
* date @ 2015-12-02 16:53:43
* brief @
*/exec("php ./broadcast_daemons.php >/dev/null &"); echo "finished!"; ?>
客戶端資訊
os server http user agent 瀏覽者作業系統及瀏覽器 分析瀏覽器 if strpos os,netcaptor explorer netcaptor elseif strpos os,msie 6 explorer msie 6.x elseif strpos os,msie ...
獲取客戶端資訊
request.browser.majorversion.tostring 獲取客戶端瀏覽器的 主 版本號request.browser.version.tostring 獲取客戶端瀏覽器的完整版本號 request.browser.platform.tostring 獲取客戶端使用平台的名字 re...
jsp獲取客戶端資訊
string agent request.getheader user agent stringtokenizer st new stringtokenizer agent,st.nexttoken 得到使用者的瀏覽器名 string userbrowser st.nexttoken 得到使用者的作...