精华内容
下载资源
问答
  • [Android]获取局域网广播地址的两种方法 第一种是自己写的,有一些bug,不过凑合着用也可以,第二种是stackoverflow的,推荐用这种。 (1) private InetAddress calcBroadcastAddress(InetAddress mask, ...

    [Android]获取局域网广播地址的两种方法

    第一种是自己写的,有一些bug,不过凑合着用也可以,第二种是stackoverflow的,推荐用这种。

    (1)

    private InetAddress calcBroadcastAddress(InetAddress mask, InetAddress ip)
    			throws IOException {
    		int ipaddress = getIntAddress(ip);
    		int maskaddress = getIntAddress(mask);
    		int broadcast = ipaddress & maskaddress | ~maskaddress;
    		byte[] quads = new byte[4];
    		for (int k = 0; k < 4; k++) {
    			quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    		}
    		return InetAddress.getByAddress(quads);
    	}
    
    	private InetAddress getBroadcastAddress() throws IOException {
    		// 自动获取
    		String strIp = getCommandResult("/system/bin/getprop",
    				"dhcp.eth0.ipaddress");
    		String strMask = getCommandResult("/system/bin/getprop",
    				"dhcp.eth0.mask");
    		if (!strIp.equals("\n")) {
    			InetAddress mask = InetAddress.getByName(strMask);
    			InetAddress ip = InetAddress.getByName(strIp);
    			Log.v("ws-discovery", "auto ip:" + strIp);
    			return calcBroadcastAddress(mask, ip);
    
    		} else {
    			// 手动配置
    			String strManual = getCommandResult("/system/bin/ifconfig", "eth0");
    			String[] netInfo = strManual.split(" ");
    			if (netInfo.length >= 5) {
    				InetAddress mask = InetAddress.getByName(netInfo[4]);
    				InetAddress ip = InetAddress.getByName(netInfo[2]);
    				Log.v("ws-discovery", "manual ip:" + netInfo[2]);
    				return calcBroadcastAddress(mask, ip);
    			}
    		}
    		// wifi
    		WifiManager wifi = (WifiManager) mContext
    				.getSystemService(Context.WIFI_SERVICE);
    		DhcpInfo dhcp = wifi.getDhcpInfo();
    		Log.v("ws-discovery", "wifi ip:" + Integer.toString(dhcp.ipAddress));
    		int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    		byte[] quads = new byte[4];
    		for (int k = 0; k < 4; k++) {
    			quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    		}
    		return InetAddress.getByAddress(quads);
    	}
    private int getIntAddress(InetAddress address) {
    		byte[] addrs = address.getAddress();
    		int addr = 0;
    		addr = ((addrs[3] & 0xff) << 24) | ((addrs[2] & 0xff) << 16)
    				| ((addrs[1] & 0xff) << 8) | (addrs[0] & 0xff);
    		return addr;
    	}
    
    	private String getCommandResult(String commands, String args) {
    		Process process = null;
    		String inet = null;
    		try {
    			process = new ProcessBuilder().command(commands, args)
    					.redirectErrorStream(true).start();
    			InputStream in = process.getInputStream();
    			int count = 0;
    			while (count == 0) {
    				count = in.available();
    			}
    			byte[] b = new byte[count];
    			in.read(b);
    			inet = new String(b);
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (process != null)
    				process.destroy();
    		}
    		return inet;
    	}
    
    


    (2)

    public static String getBroadcast() throws SocketException {
    	    System.setProperty("java.net.preferIPv4Stack", "true");
    	    for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); niEnum.hasMoreElements();) {
    	        NetworkInterface ni = niEnum.nextElement();
    	        if (!ni.isLoopback()) {
    	            for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
    	            	if (interfaceAddress.getBroadcast() != null) {
    	            		return interfaceAddress.getBroadcast().toString().substring(1);
    					}
    	            }
    	        }
    	    }
    	    return null;
    	}
    展开全文
  • 换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。通常我们讨论的...

    使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

    通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

    UDP广播

    广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

    广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

    其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

    UDP多播

    同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。

    使用java 的UDP进行广播,要分两步走,首先要加入到广播组地址,其次要建立套接字传输信息

    关于广播,涉及到MulticastSocket,他用于接收广播的信息,前提是要将它加入到广播组,组播的地址是保留的D类地址从224.0.0.0—239.255.255.255,而且一些地址有特定的用处如,224.0.0.0—244.0.0.255只能用于局域网中路由器是不会转发的,并且224.0.0.1是所有主机的地址,224.0.0.2所有路由器的地址,224.0.0.5所有ospf路由器的地址,224.0.13事PIMv2路由器的地址;239.0.0.0—239.255.255.255是私有地址(如192.168.x..x);224.0.1.0—238.255.255.255可以用与Internet上的。这里我们就选取230.0.0.1作为我们的广播地址。

    此软件类似于飞鸽,用于局域网通信,每个客户端上线都要寻找局域网其他主机并把自己的信息和所有主机交换,以此模式更新。。。

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.InetAddress;

    import java.net.MulticastSocket;

    /**

    *

    项目名称:UDPMulticastDemo

    *

    类名称:lanDemo

    *

    类描述:

    *

    创建人:wuzq,zhongqianhit@163.com

    *

    创建时间:2012-6-7 上午10:21:06

    *

    修改人:wuzq,zhongqianhit@163.com

    *

    修改时间:2012-6-7 上午10:21:06

    *

    修改备注:

    * @version

    **/

    class lanSend {

    // 广播地址

    private static final String BROADCAST_IP = "230.0.0.1";// 广播IP

    private static final int BROADCAST_INT_PORT = 40005; // 不同的port对应不同的socket发送端和接收端

    MulticastSocket broadSocket;// 用于接收广播信息

    DatagramSocket sender;// 数据流套接字 相当于码头,用于发送信息

    InetAddress broadAddress;// 广播地址

    public lanSend() {

    try {

    // 初始化

    broadSocket = new MulticastSocket(BROADCAST_INT_PORT);

    broadAddress = InetAddress.getByName(BROADCAST_IP);

    sender = new DatagramSocket();

    } catch (Exception e) {

    // TODO: handle exception

    System.out.println("*****lanSend初始化失败*****" + e.toString());

    }

    }

    void join() {

    try {

    broadSocket.joinGroup(broadAddress); // 加入到组播地址,这样就能接收到组播信息

    new Thread(new GetPacket()).start(); // 新建一个线程,用于循环侦听端口信息

    } catch (Exception e) {

    // TODO: handle exception

    System.out.println("*****加入组播失败*****");

    }

    }

    // 广播发送查找在线用户

    void sendGetUserMsg() {

    byte[] b = new byte[1024];

    DatagramPacket packet; // 数据包,相当于集装箱,封装信息

    try {

    b = ("find@" + lanDemo.msg).getBytes();

    packet = new DatagramPacket(b, b.length, broadAddress,

    BROADCAST_INT_PORT); // 广播信息到指定端口

    sender.send(packet);

    System.out.println("*****已发送请求*****");

    } catch (Exception e) {

    System.out.println("*****查找出错*****");

    }

    }

    // 当局域网内的在线机子收到广播信息时响应并向发送广播的ip地址主机发送返还信息,达到交换信息的目的

    void returnUserMsg(String ip) {

    byte[] b = new byte[1024];

    DatagramPacket packet;

    try {

    b = ("retn@" + lanDemo.msg).getBytes();

    packet = new DatagramPacket(b, b.length, InetAddress.getByName(ip),

    BROADCAST_INT_PORT);

    sender.send(packet);

    System.out.print("发送信息成功!");

    } catch (Exception e) {

    // TODO: handle exception

    System.out.println("*****发送返还信息失败*****");

    }

    }

    // 当局域网某机子下线是需要广播发送下线通知

    void offLine() {

    byte[] b = new byte[1024];

    DatagramPacket packet;

    try {

    b = ("offl@" + lanDemo.msg).getBytes();

    packet = new DatagramPacket(b, b.length, broadAddress,

    BROADCAST_INT_PORT);

    sender.send(packet);

    System.out.println("*****已离线*****");

    } catch (Exception e) {

    // TODO: handle exception

    System.out.println("*****离线异常*****");

    }

    }

    class GetPacket implements Runnable { // 新建的线程,用于侦听

    public void run() {

    DatagramPacket inPacket;

    String[] message;

    while (true) {

    try {

    inPacket = new DatagramPacket(new byte[1024], 1024);

    broadSocket.receive(inPacket); // 接收广播信息并将信息封装到inPacket中

    message = new String(inPacket.getData(), 0,

    inPacket.getLength()).split("@"); // 获取信息,并切割头部,判断是何种信息(find--上线,retn--回答,offl--下线)

    if (message[1].equals(lanDemo.ip))

    continue; // 忽略自身

    if (message[0].equals("find")) { // 如果是请求信息

    System.out.println("新上线主机:" + " ip:" + message[1]

    + " 主机:" + message[2]);

    returnUserMsg(message[1]);

    } else if (message[0].equals("retn")) { // 如果是返回信息

    System.out.println("找到新主机:" + " ip:" + message[1]

    + " 主机:" + message[2]);

    } else if (message[0].equals("offl")) { // 如果是离线信息

    System.out.println("主机下线:" + " ip:" + message[1]

    + " 主机:" + message[2]);

    }

    } catch (Exception e) {

    // TODO: handle exception

    System.out.println("线程出错 " + e);

    }

    }

    }

    }

    }

    public class lanDemo {

    // 全局变量

    public static String msg;

    public static String ip;

    public static String hostName;

    public static void main(String[] args) { // 程序入口点

    lanSend lSend;

    try {

    InetAddress addr = InetAddress.getLocalHost();

    ip = addr.getHostAddress().toString();

    hostName = addr.getHostName().toString();

    msg = ip + "@" + hostName;

    lSend = new lanSend();

    lSend.join(); // 加入组播,并创建线程侦听

    lSend.sendGetUserMsg(); // 广播信息,寻找上线主机交换信息

    Thread.sleep(10000); // 程序睡眠5秒

    lSend.offLine(); // 广播下线通知

    } catch (Exception e) {

    System.out.println("*****获取本地用户信息出错*****");

    }

    }

    }

    展开全文
  • Golang 局域网广播消息

    2020-11-03 16:46:40
    消息发送方 server.go package main import ( "bufio" "log" "net" "os" ) func main() { laddr := net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0),//... IP: net.IPv4(192, 168, 1, 255), //局域网广播地址 Por

    消息发送方 server.go

    package main
    
    import (
    	"bufio"
    	"log"
    	"net"
    	"os"
    )
    
    func main() {
    
    	laddr := net.UDPAddr{
    		IP:   net.IPv4(0, 0, 0, 0),//写局域网下分配IP,0.0.0.0可以用来测试
    		Port: 8080,
    	}
    
    	raddr := net.UDPAddr{
    		IP:   net.IPv4(192, 168, 1, 255), //局域网广播地址
    		Port: 8080,
    	}
    
    	conn, err := net.DialUDP("udp", &laddr, &raddr)
    
    	if err != nil {
    		log.Panicln(err.Error())
    	}
    
    	defer conn.Close()
    	scan := bufio.NewScanner(os.Stdin)
    
    	for scan.Scan() {
    		mess := scan.Text()
    		if mess == "quit" {
    			return
    		}
    		_, err := conn.Write([]byte(mess))
    		if err != nil {
    			log.Panicln(err.Error())
    		}
    	}
    }
    
    

    消息接收方:client.go

    package main
    
    import (
    	"log"
    	"net"
    )
    
    func main() {
    	net.InterfaceAddrs()
    	laddr := net.UDPAddr{
    		IP:   net.IPv4(0, 0, 0, 0), //写局域网下分配IP,0.0.0.0可以用来测试
    		Port: 8080,
    	}
    	conn, err := net.ListenUDP("udp", &laddr)
    	if err != nil {
    		log.Panicln(err.Error())
    	}
    	defer conn.Close()
    	buf := make([]byte, 1024)
    	for {
    		n, err := conn.Read(buf)
    		if err != nil {
    			log.Panicln(err.Error())
    		}
    		log.Println(string(buf[:n]))
    	}
    }
    
    
    展开全文
  • 绿色 小巧,功能强大 超好用的局域网广播软件 亲测支持无线广播 支持win10 64位,应用教学广播,公司培训屏幕广播神器
  • 我们要使用UDP广播,那么需要的是使用setsockopt( )函数,参数使用如下: sock:将要被设置或者获取选项的套接字。 level:选项所在的协议层。 level指定控制套接字的层次.可以取三种值: 1)SOL_SOCKET:通用...

    1.getsockopt和setsockopt函数的使用

    该函数是系统手册可以查询得到,可以用

    man setsockopt

    得到的信息如下:

    我们要使用UDP广播,那么需要的是使用setsockopt( )函数,参数使用如下:

    • sock:将要被设置或者获取选项的套接字。

    level:选项所在的协议层。
    level指定控制套接字的层次.可以取三种值:
    1)SOL_SOCKET:通用套接字选项.
    2)IPPROTO_IP:IP选项.
    3)IPPROTO_TCP:TCP选项.

     

    • optname:需要访问的选项名。这里以SOL_SOCKET为例,列出他的选项:

    SOL_SOCKET

    SO_BROADCAST允许发送广播数据int
    SO_DEBUG  允许调试int
    SO_DONTROUTE      不查找路由 int
    SO_ERROR        获得套接字错误       int
    SO_KEEPALIVE保持连接int
    SO_LINGER延迟关闭连接struct linger
    SO_OOBINLINE      带外数据放入正常数据流  int
    SO_RCVBUF       接收缓冲区大小       int
    SO_SNDBUF       发送缓冲区大小   int
    SO_RCVLOWAT      接收缓冲区下限   int
    SO_SNDLOWAT      发送缓冲区下限    int
    SO_RCVTIMEO      接收超时 struct timeval
    SO_SNDTIMEO      发送超时 struct timeval
    SO_REUSERADDR     允许重用本地地址和端口int
    SO_TYPE        获得套接字类型int
    SO_BSDCOMPAT      与BSD系统兼容in

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    • optval:指定值,一般非0就是肯定,
    • optlen:指定值的长度。

    需要与一般通信不同的是,不断广播的sockaddr数据结构赋值法为:

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(9988);
    server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    server_addrlen = sizeof(struct sockaddr_in);
    

    2.实例代码:

    不断发送服务器:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <signal.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    int main()
    {
            int server_fd;
            struct sockaddr_in client_addr;
            const int opt = 1;
            char s_buffer[128] = {0};
            socklen_t clen = 0;
            int ret =0;
    
            client_addr.sin_family = AF_INET;
            client_addr.sin_port = htons(9898);
            client_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
            clen = sizeof(struct sockaddr_in);
    
            server_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if (server_fd < 0){
                    printf("Ceate socket fail\n");
                    exit(1);
            }
    
            ret = setsockopt(server_fd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
            if (ret < 0){
                    printf("Set socket to broadcast fail\n");
                    exit(2);
            }
            strcpy(s_buffer,"abcefghijklmnopqrstuvwsyz\n");
    
            while (1) {
    
                    ret = sendto(server_fd,s_buffer, 128,0,(struct sockaddr *)&client_addr, clen);
                    if(ret < 0)
                    {
                            printf("send to failed\n");
                            exit(3);
                    }
                    printf("broacasting...");
                    sleep(1);
            }
    
            return 0;
    }
    

    接收端自行实现.。

    展开全文
  • 局域网广播系统

    2018-11-17 16:55:57
    基于java语言实现的局域网广播系统,对于刚接触java语言的同学比较适用,有java 简单的网络编程知识点,比较好用,共勉
  • 局域网广播Netwoek.rar

    2020-01-17 10:21:23
    U3D局域网的源码,只需要将ClientMain和ServerMain拉上gameobject上,运行点击空格或A即可测试
  • 局域网广播

    2018-06-15 14:24:34
    局域网广播是UDP的应用之一。UDP协议与TCP协议同样是基于IP协议的,但与TCP不同的是它不需要协议层提供质量保证,因此,UDP在很多需要实时数据传输的情况下比较常用。此外,由于不提供质量保证,服务器没有必要一直...
  • 本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下: 服务器端: # udp_gb_server.py '''服务端(UDP协议局域网广播)''' import socket s = socket.socket(socket.AF_...
  • 局域网音视频广播软件。 本文件夹内包含了局域网内实现组播发送音视频数据的实现软件,延迟在300ms内,音画同步;运行环境需要有线局域网,支持win7、win8、win10,32位及64位 ffmpeg 局域网组播 教学
  • iOS局域网广播

    2018-05-08 15:34:44
    iOS局域网广播,采用Socket Udp局域网广播,通知其他客户端,实现两个手机Udp聊天功能。
  • 主要介绍了Android编程实现基于局域网udp广播自动建立socket连接的方法,涉及Android使用udp广播实现socket通讯的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • socket的局域网广播

    千次阅读 2014-09-19 16:29:38
    很多局域网都定义了一个特殊的保留地址, 称为广播地址. 当信息头中目的地址域的内容为广播地址时, 该帧被局域网上所有计算机接收.  这个过程称为广播.合法的广播地址就是主机的网络地址加上最大的主机号。网络...
  • python 获取局域网内的广播地址

    千次阅读 2016-05-10 13:36:04
    #########计算广播地址 broad_list = [] for j in ip_add: subMask_split = subMask.split( "." ) myIp = (j+ ".1" ).split( "." ) str_cast = "" for i in xrange ( 4 ): xx = ( int (myIp[i])&...
  • 局域网的组播和广播

    千次阅读 2018-08-11 13:50:06
    写在前面:项目中,局域网发现协议是通过局域网组播和局域网广播混合实现的。因为单独使用组播或者广播, 都有可能被路由器或者客户端过滤掉,而不能发送到接收方。采用两者并用提高发送消息的成功率。当然了,组播...
  • 由服务器进行广播,客户端只需要进行相应的客户端程序,就可以接收到服务器广播的信息。客户端可以随时开始或停止接收广播.此系统必须在有局域网的计算机上才能运行。并有详细的说明文档。是一个不错的广播程序。
  • 用Socket在局域网内进行广播

    千次阅读 2018-11-09 07:23:26
    用Socket在局域网内进行广播
  • 局域网广播系统java源码.rar
  • 局域网屏幕广播C#

    2014-09-03 10:20:47
    vs20008下用c#语言编写的屏幕捕获程序,捕获的桌面图像带鼠标和光标,使用UDP组播方式在局域网中传输,图像压缩方式Jpeg,并且在传输过程中实现了分帧与重组功能,在window7下经过长时间测试。
  • 局域网广播程序的实现.rar局域网广播程序的实现.rar
  • 一个Android程序,使用UDP协议在局域网广播局域网内所有手机都可以接收到消息
  • Python发送局域网广播

    2021-01-12 21:47:35
    利用Python的broadcast机制发送局域网广播 # -*- coding: utf-8 -*- import socket def send(operation): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_...
  • bonjour 纯JavaScript中的Bonjour / Zeroconf协议实现。使用多播DNS在本地网络上发布服务或...局域网A主机: import bonjour from 'bonjour' //3000端口开启name = my-is-hostA的服务 const bonjourServer = bonjo...
  • 开发中有事需要一个功能是教师机通过广播发送给学生机实现通讯,这时可以考试使用socket的udp广播功能来实现,代码如下: using System; using System.Text; using UnityEngine; using System.Net.Sockets; using ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,357
精华内容 26,942
关键字:

局域网广播地址