PHP向客户端广播信息
在网络中数据传播分为: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 语言作为客户端进行测试:
- broadcast.php
<?php # Script -- broadcast.php
/* Author @ Huoty
* Date @ 2015-11-17 09:58:25
* Brief @
*/
/* 创建广播事件 */
function broadcast()
{
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
//使用IPV4格式地址,数据报形式,UDP方式传输数据
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //设置为广播方式
while ( true ) {
$msg = 'Hi! ' . date("y-m-d h:i:s",time()); //要发送的字符串
socket_sendto($sock, $msg, strlen($msg), 0, "255.255.255.255", 12345);
//发送,255.255.255.255是广播地址,12345是端口
//echo "Broadcast...\n";
sleep( 2 );
}
socket_close($sock); //关闭
}
/* 创建守护进程 */
$pid = pcntl_fork();
if ($pid < 0)
{
die("fork failed!\n");
}
else if ($pid > 0)
{
exit;
}
else
{
/* 输出进程ID,便于 kill */
echo "Daemons ID: " . posix_getpid() . "\n";
/* 保持程序的运行 */
set_time_limit(0);
/* 创建一个新的 Session */
$sid = posix_setsid();
if ($sid < 0)
{
exit;
}
/* 改变工作目录为根目录 */
chdir("/");
broadcast();
}
?>
- client.php
<?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 ) {
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 <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#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;
}
通常,广播是需要长时间进行的任务,所以可以创建一个守护进程来完成广播,以避免程序长时间运行对控制终端的占用。如果不使用守护进程,也可以用 Linux 的 nohup
命令来实现。然而,PHP 的进程控制不能被应用在 Web 服务器环境。那么,要让 PHP 的进程控制在 Web 环境下得到应用,可以用一个迂回的办法,即用 cli
的方式执行包含进程控制的 PHP 文件,所谓 cli 方式是指 shell 的执行方式。还有一个需要注意的问题是,在 Web 环境下,由于 PHP 程序是一个死循环,程序一直运行,所以客户端总是得不到服务器的返回结果。为解决这个问题,可以将用 &
让程序在后台运行,同时将输出重定向到 /dev/null
。于是可以创建了一个新文件以保证广播在 Web 服务器环境下能够被触发:
- startup.php
<?php # Script -- startup.php
/* Author @ Huoty
* Date @ 2015-12-02 16:53:43
* Brief @
*/
exec("php ./broadcast_daemons.php >/dev/null &");
echo "Finished!";
?>
PHP向客户端广播信息的更多相关文章
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...
- 如何进行SCCM中客户端记录信息维护
SCCM 部署完毕之后,不久我们就会发现客户端代理状态,因为重装系统,非正常的退域,长时间不开机,导致客户端状态有不可用的,有过期的,重复的记录很多.当然我们可以手动的快速删除重复的记录,那么怎么能做 ...
- socket 套接字服务器端和客户端发送信息
import socket import threading host='' port=6889 def cilenThred(conn,addr): print("成功接受客户端{}的连接 ...
- netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~
还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01 . netty02 .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...
- 问题请教:关于同一个POD中多容器的广播信息问题
广大博友好,最近在K8S集群中遇到一个问题,贴出来同大家分享一下 同一个POD中多个容器 如何处理广播信息? 经测试 同一个POD中当先启动的容器占用广播端口后,其他的容器启动就会报bind erro ...
- (转)openfire插件开发(三)通过http方式向openfire客户端发信息
转:http://blog.csdn.net/hzaccp3/article/details/19964655 需求: 通过http方式,向openfire客户端发信息(非XMPP协议)openfi ...
- 微信小程序之蓝牙广播信息
期初第一次做蓝牙开锁的时候遇到的最尖锐的问题就是ios设备如何对获取的广播信息进行读取,大概用了4中方式,都无法解决,最后不得不求助官方人员.给了一个方法,大家可以参考.在此附图: 由于mac地址是6 ...
- ABP VNext框架中Winform终端的开发和客户端授权信息的处理
在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...
- Python socket 广播信息到所有连接的客户端
Python3,多线程,多客户端,广播数据 #!/usr/bin/env python3 import time import threading import queue import socket ...
随机推荐
- [转]Cryengine渲染引擎剖析
转篇Napoleon314 大牛的分析,排版好乱,见谅,耐心读,这是个好东西,注意看他自己的实现,是个技术狂人啊,Ogre焕发次时代的光芒啊~~~努力 ------------------------ ...
- 理解 Git 的基本概念 ( Merging Collaborating Rebasing)
合并 Merging 在分支上开发新功能后,如何把新功能加入到主分支,让其它人得到你的修改呢?你需要使用命令 git merge 或 git pull. 这两个命令的语法如下: git merge [ ...
- Android之微信开放平台创建应用
微信开放平台网站:https://open.weixin.qq.com 1:登录之后(未登录就注册),点击移动应用开发进入 点击创建应用之后,进入填写对应信息. 接下来,填写平台信息. 应用签名获取方 ...
- PowerDesigner16工具学习笔记-建立BPM
根据不同用途,BPM分为分析性(Analysis).执行型(Executable)和协作型(Collaborative) BPM的类型 业务流程语言 描述 分析型 Analysis 提供流程层次 ...
- UVA-1604 Cubic Eight-Puzzle (双向BFS+状态压缩+限制搜索层数)
题目大意:立体的八数码问题,一次操作是滚动一次方块,问从初始状态到目标状态的最少滚动次数. 题目分析:这道题已知初始状态和目标状态,且又状态数目庞大,适宜用双向BFS.每个小方块有6种状态,整个大方格 ...
- 谈谈oracle里的join、left join、right join
create table l as select 'left_1' as str,'1' as v from dual union allselect 'left_2' ,'2' as v from ...
- DataReader 绑定DataGridView有两种方式
第一种:借助于BindingSourcesqlDataReader Sdr=通过查询函数得到的sqlDataReader类型的数据;BindingSource Bs=new BindingSource ...
- echart3 湖北地图及如何创建其他省份地图
刚刚收到一封园友求助echart湖北地图的邮件,现在将湖北地图的所有代码贴到这里,希望可以帮助到更多朋友. 1.首先你得到echarts官网下载js,很多人说找不到,可以到我的git下载(https: ...
- jquery+html5制作超酷的圆盘时钟表
自己封装的一个用HTML5+jQuery写的时钟表 代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- 本地绑定域名及host做快速解析与域名屏蔽处理
在电脑中成功安装好IIS后,打开C:\WINDOWS\system32\drivers\etc\用记事本打开hosts文件,把127.0.0.1 localhost复制,粘贴到最后,然后把loca ...