在网络中数据传播分为: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
  1. <?php # Script -- broadcast.php
  2. /* Author @ Huoty
  3. * Date @ 2015-11-17 09:58:25
  4. * Brief @
  5. */
  6. /* 创建广播事件 */
  7. function broadcast()
  8. {
  9. $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
  10. //使用IPV4格式地址,数据报形式,UDP方式传输数据
  11. socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //设置为广播方式
  12. while ( true ) {
  13. $msg = 'Hi! ' . date("y-m-d h:i:s",time()); //要发送的字符串
  14. socket_sendto($sock, $msg, strlen($msg), 0, "255.255.255.255", 12345);
  15. //发送,255.255.255.255是广播地址,12345是端口
  16. //echo "Broadcast...\n";
  17. sleep( 2 );
  18. }
  19. socket_close($sock); //关闭
  20. }
  21. /* 创建守护进程 */
  22. $pid = pcntl_fork();
  23. if ($pid < 0)
  24. {
  25. die("fork failed!\n");
  26. }
  27. else if ($pid > 0)
  28. {
  29. exit;
  30. }
  31. else
  32. {
  33. /* 输出进程ID,便于 kill */
  34. echo "Daemons ID: " . posix_getpid() . "\n";
  35. /* 保持程序的运行 */
  36. set_time_limit(0);
  37. /* 创建一个新的 Session */
  38. $sid = posix_setsid();
  39. if ($sid < 0)
  40. {
  41. exit;
  42. }
  43. /* 改变工作目录为根目录 */
  44. chdir("/");
  45. broadcast();
  46. }
  47. ?>
  • client.php
  1. <?php # Script -- client.php
  2. /* Author @ Huoty
  3. * Date @ 2015-11-17 09:58:25
  4. * Brief @
  5. */
  6. //error_reporting( E_ALL );
  7. set_time_limit( 0 );
  8. ob_implicit_flush();
  9. $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
  10. if ( $socket === false ) {
  11. echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";
  12. }
  13. $ok = socket_bind( $socket, '255.255.255.255', 12345 );
  14. if ( $ok === false ) {
  15. echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
  16. }
  17. while ( true ) {
  18. $from = "";
  19. $port = 0;
  20. socket_recvfrom( $socket, $buf, 1024, 0, $from, $port );
  21. echo $buf . "\n";
  22. usleep( 1000 );
  23. }
  24. ?>
  • client.c
  1. /* client.c */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <netinet/in.h>
  6. #define MAXLINE 80
  7. #define SERV_PORT 12345
  8. int main(int argc, char *argv[])
  9. {
  10. struct sockaddr_in servaddr;
  11. int sockfd, n;
  12. char buf[MAXLINE];
  13. char str[INET_ADDRSTRLEN];
  14. socklen_t servaddr_len;
  15. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  16. bzero(&servaddr, sizeof(servaddr));
  17. servaddr.sin_family = AF_INET;
  18. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  19. servaddr.sin_port = htons(SERV_PORT);
  20. bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
  21. fprintf(stdout, "Accepting connections ...\n");
  22. memset(buf, 0, sizeof(buf));
  23. while ( 1 ) {
  24. n = recvfrom(sockfd, buf, MAXLINE, 0, NULL, 0);
  25. if (n == -1)
  26. fprintf(stderr, "recvfrom error");
  27. fprintf(stdout, "%s\n", buf);
  28. memset(buf, 0, sizeof(buf));
  29. }
  30. close(sockfd);
  31. return 0;
  32. }

通常,广播是需要长时间进行的任务,所以可以创建一个守护进程来完成广播,以避免程序长时间运行对控制终端的占用。如果不使用守护进程,也可以用 Linux 的 nohup 命令来实现。然而,PHP 的进程控制不能被应用在 Web 服务器环境。那么,要让 PHP 的进程控制在 Web 环境下得到应用,可以用一个迂回的办法,即用 cli 的方式执行包含进程控制的 PHP 文件,所谓 cli 方式是指 shell 的执行方式。还有一个需要注意的问题是,在 Web 环境下,由于 PHP 程序是一个死循环,程序一直运行,所以客户端总是得不到服务器的返回结果。为解决这个问题,可以将用 & 让程序在后台运行,同时将输出重定向到 /dev/null。于是可以创建了一个新文件以保证广播在 Web 服务器环境下能够被触发:

  • startup.php
  1. <?php # Script -- startup.php
  2. /* Author @ Huoty
  3. * Date @ 2015-12-02 16:53:43
  4. * Brief @
  5. */
  6. exec("php ./broadcast_daemons.php >/dev/null &");
  7. echo "Finished!";
  8. ?>

PHP向客户端广播信息的更多相关文章

  1. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  2. 如何进行SCCM中客户端记录信息维护

    SCCM 部署完毕之后,不久我们就会发现客户端代理状态,因为重装系统,非正常的退域,长时间不开机,导致客户端状态有不可用的,有过期的,重复的记录很多.当然我们可以手动的快速删除重复的记录,那么怎么能做 ...

  3. socket 套接字服务器端和客户端发送信息

    import socket import threading host='' port=6889 def cilenThred(conn,addr): print("成功接受客户端{}的连接 ...

  4. netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~

    还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01   . netty02  .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...

  5. 问题请教:关于同一个POD中多容器的广播信息问题

    广大博友好,最近在K8S集群中遇到一个问题,贴出来同大家分享一下 同一个POD中多个容器 如何处理广播信息? 经测试 同一个POD中当先启动的容器占用广播端口后,其他的容器启动就会报bind erro ...

  6. (转)openfire插件开发(三)通过http方式向openfire客户端发信息

    转:http://blog.csdn.net/hzaccp3/article/details/19964655 需求:  通过http方式,向openfire客户端发信息(非XMPP协议)openfi ...

  7. 微信小程序之蓝牙广播信息

    期初第一次做蓝牙开锁的时候遇到的最尖锐的问题就是ios设备如何对获取的广播信息进行读取,大概用了4中方式,都无法解决,最后不得不求助官方人员.给了一个方法,大家可以参考.在此附图: 由于mac地址是6 ...

  8. ABP VNext框架中Winform终端的开发和客户端授权信息的处理

    在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...

  9. Python socket 广播信息到所有连接的客户端

    Python3,多线程,多客户端,广播数据 #!/usr/bin/env python3 import time import threading import queue import socket ...

随机推荐

  1. [osg][原创]osg多屏幕显示,会出现透明需要设置的问题

    同事由于新加了一个屏幕,本来用 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->s ...

  2. Rails 5 Test Prescriptions 第8章 Integration Testing with Capybara and Cucumber

    Capybara:  A complete reference is available atrubydoc.info. 集成测试就是把局部的程序组合起来测试. 端到端测试是一个特殊的集成测试,覆盖了 ...

  3. xtrabackup三种备份和还原(一)

    写这边博客心情不是太美好(博客已经停更2个多月了,实在是没心情学习新东西.2018我的黑暗年,呵呵)好了,不废话了,本文没有任何原理的部分,我也是刚开始接触xtrabackup这个工具.本文应该是一个 ...

  4. Backbone设计思路和关键源码分析

    一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开 ...

  5. Thunder7.2.13.3884 JayXon

    更新日志: 更新迅雷7. 更新VipService 2.7 更新SQLite 更新zlib 不再精简msvcr71.dll.msvcp71.dll 不再精简64位BHO 破解了本地离线重命名30个字符 ...

  6. 『转』Emsisoft Anti-Malware 8刷Key教程 - 文字版

    先分主机和客机,下载好 EAM8安装包 和 30天重置工具EAM Trial Reset 1.1.exe 1. 主机安装 Emsisoft Anti-Malware 8 并激活30天试用版   如果已 ...

  7. 结合File类浅析递归的使用

    递归算法就是方法自身直接或者间接地调用到了自身,它是一种写起来很简单,但理解起来不那么简单的算法. 一个功能在被重复地调用,并且运算的结果和上一次的调用有关, 这种时候,可以使用递归. * 注意: * ...

  8. Codeforces 158B:Taxi

    B. Taxi time limit per test 3 seconds memory limit per test 256 megabytes input standard input outpu ...

  9. Chrome 解决flash问题

    Chrome 无法显示使用插件的内容 Chrome 不再支持很多插件.不过网站创建者已经通过更安全的方式,将多数这类功能添加到 Chrome 中. 为什么 NPAPI 插件现在无法正常运行过去,许多插 ...

  10. gridview 绑定多个格式相同的数据源(数据查询合并)

    在做项目时,要求在同一个GridView中同时显示不同分组中的前若干条数据 几个技术要点: 1.数据分组,本方法中未用group by 2.几个结果格式相同的查询合并绑定 3.取查询结果的前或后若干条 ...