日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

信息倒流php,PHP向客户端广播信息

發(fā)布時間:2024/8/5 php 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息倒流php,PHP向客户端广播信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在網(wǎng)絡(luò)中數(shù)據(jù)傳播分為:Unicast(單播) , Multicast(多播或者組播) 和 Broadcast(廣播)。廣播和多播僅應(yīng)用于UDP,它們對需將報(bào)文同時傳往多個接收者的應(yīng)用來說十分重要。而 TCP 是一個面向連接的協(xié)議,它意味著分別運(yùn)行于兩主機(jī)(由IP地址確定)內(nèi)的兩進(jìn)程(由端口號確定)間存在一條連接。廣播地址在默認(rèn)情況下是不能讓路由器轉(zhuǎn)發(fā)到別的接口的,廣播不能穿越路由器。廣播有以下幾種形式:

受限的廣播:

受限的廣播地址是255.255.255.255,該地址用于主機(jī)配置過程中IP數(shù)據(jù)報(bào)的地址,此時,主機(jī)可能還不知道它所在網(wǎng)絡(luò)的網(wǎng)絡(luò)掩碼,甚至連它的IP地址也不知道。在任何情況下,路由器都不轉(zhuǎn)發(fā)目的地址為受限廣播地址的數(shù)據(jù)報(bào),這樣的數(shù)據(jù)報(bào)只出現(xiàn)在本地網(wǎng)絡(luò)中。

指向網(wǎng)絡(luò)的廣播:

指向網(wǎng)絡(luò)的廣播地址是主機(jī)號全為1的地址,A類網(wǎng)絡(luò)廣播地址為netid.255.255.255,其中netid為A類網(wǎng)絡(luò)的網(wǎng)絡(luò)號。

指向子網(wǎng)的廣播:

指向子網(wǎng)的廣播地址是主機(jī)號全為1的地址,作為子網(wǎng)直接廣播的IP地址需要知道子網(wǎng)的掩碼。如果B類網(wǎng)絡(luò)128.1的子網(wǎng)掩碼是255.255.255.0,則地址128.1.2.255就是對應(yīng)子網(wǎng)的廣播地址。

指向所有子網(wǎng)的廣播:

指向所有子網(wǎng)的廣播也需要知道目的網(wǎng)絡(luò)的子網(wǎng)掩碼。這些廣播地址的子網(wǎng)號和主機(jī)號全為1。如果目的子網(wǎng)掩碼是255.255.255.0,那么IP地址128.1.255.255就是一個指向所有子網(wǎng)的廣播地址。

PHP socket 也能實(shí)現(xiàn)廣播。在 socket 通信中,實(shí)現(xiàn)連接的服務(wù)器與客戶端需要綁定同一端口號,端口號表示發(fā)送和接收的進(jìn)程。下面是一個用 PHP 實(shí)現(xiàn)的簡單的廣播通信例子,同時采用 PHP 和 C 語言作為客戶端進(jìn)行測試:

broadcast.php

/* Author @ Huoty

* Date @ 2015-11-17 09:58:25

* Brief @

*/

/* 創(chuàng)建廣播事件 */

function broadcast()

{

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

//使用IPV4格式地址,數(shù)據(jù)報(bào)形式,UDP方式傳輸數(shù)據(jù)

socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //設(shè)置為廣播方式

while ( true ) {

$msg = 'Hi! ' . date("y-m-d h:i:s",time()); //要發(fā)送的字符串

socket_sendto($sock, $msg, strlen($msg), 0, "255.255.255.255", 12345);

//發(fā)送,255.255.255.255是廣播地址,12345是端口

//echo "Broadcast...\n";

sleep( 2 );

}

socket_close($sock); //關(guān)閉

}

/* 創(chuàng)建守護(hù)進(jìn)程 */

$pid = pcntl_fork();

if ($pid < 0)

{

die("fork failed!\n");

}

else if ($pid > 0)

{

exit;

}

else

{

/* 輸出進(jìn)程ID,便于 kill */

echo "Daemons ID: " . posix_getpid() . "\n";

/* 保持程序的運(yùn)行 */

set_time_limit(0);

/* 創(chuàng)建一個新的 Session */

$sid = posix_setsid();

if ($sid < 0)

{

exit;

}

/* 改變工作目錄為根目錄 */

chdir("/");

broadcast();

}

?>

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 ) {

echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";

}

$ok = socket_bind( $socket, '255.255.255.255', 12345 );

if ( $ok === false ) {

echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );

}

while ( true ) {

$from = "";

$port = 0;

socket_recvfrom( $socket, $buf, 1024, 0, $from, $port );

echo $buf . "\n";

usleep( 1000 );

}

?>

client.c

/* client.c */

#include

#include

#include

#include

#define MAXLINE 80

#define SERV_PORT 12345

int main(int argc, char *argv[])

{

struct sockaddr_in servaddr;

int sockfd, n;

char buf[MAXLINE];

char str[INET_ADDRSTRLEN];

socklen_t servaddr_len;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(SERV_PORT);

bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

fprintf(stdout, "Accepting connections ...\n");

memset(buf, 0, sizeof(buf));

while ( 1 ) {

n = recvfrom(sockfd, buf, MAXLINE, 0, NULL, 0);

if (n == -1)

fprintf(stderr, "recvfrom error");

fprintf(stdout, "%s\n", buf);

memset(buf, 0, sizeof(buf));

}

close(sockfd);

return 0;

}

通常,廣播是需要長時間進(jìn)行的任務(wù),所以可以創(chuàng)建一個守護(hù)進(jìn)程來完成廣播,以避免程序長時間運(yùn)行對控制終端的占用。如果不使用守護(hù)進(jìn)程,也可以用 Linux 的 nohup 命令來實(shí)現(xiàn)。然而,PHP 的進(jìn)程控制不能被應(yīng)用在 Web 服務(wù)器環(huán)境。那么,要讓 PHP 的進(jìn)程控制在 Web 環(huán)境下得到應(yīng)用,可以用一個迂回的辦法,即用 cli 的方式執(zhí)行包含進(jìn)程控制的 PHP 文件,所謂 cli 方式是指 shell 的執(zhí)行方式。還有一個需要注意的問題是,在 Web 環(huán)境下,由于 PHP 程序是一個死循環(huán),程序一直運(yùn)行,所以客戶端總是得不到服務(wù)器的返回結(jié)果。為解決這個問題,可以將用 & 讓程序在后臺運(yùn)行,同時將輸出重定向到 /dev/null。于是可以創(chuàng)建了一個新文件以保證廣播在 Web 服務(wù)器環(huán)境下能夠被觸發(fā):

startup.php

/* Author @ Huoty

* Date @ 2015-12-02 16:53:43

* Brief @

*/

exec("php ./broadcast_daemons.php >/dev/null &");

echo "Finished!";

?>

總結(jié)

以上是生活随笔為你收集整理的信息倒流php,PHP向客户端广播信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。