标签: broadcast

SO_BINDTODEVICE Linux套接字选项的问题

我有一台带有两张网卡的电脑.一个(eth0)用于LAN /互联网,另一个用于与一个微控制器设备进行UDP通信.微控制器具有IP(192.168.7.2)和MAC地址.第二个pc网络适配器(eth1)有192.168.7.1.

微控制器有一个非常简单的IP堆栈,因此mc发送UDP数据包的最简单方法是广播它们.

在PC方面,我想收到广播 - 但仅限于eth1.所以我尝试将UDP套接字绑定到eth1设备.

问题(源代码如下):

  1. setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, device, sizeof(device))需要root权限,为什么?(设置其他选项作为用户)

  2. getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void *)buffer, &opt_length)给出"协议不可用".我想通过setsockopt命令回读我设置的设备.

  3. 我在哪里可以找到好消息?我检查了一些Linux编程,网络书籍,但是例如SO_BINDTODEVICE我只在互联网上找到的选项.

我冗长(肮脏)的测试程序显示了问题.设置和返回SO_RCVTIMEOSO_BROADCAST选项按预期工作.

用户退出时运行代码:

could not set SO_BINDTODEVICE (Operation not permitted)"
Run Code Online (Sandbox Code Playgroud)

使用sudo运行会给出:

SO_BINDTODEVICE set
./mc-test: could not get SO_BINDTODEVICE (Protocol not available)
Run Code Online (Sandbox Code Playgroud)

因此,设置选项似乎有效但读取它是不可能的?

/* SO_BINDTODEVICE test */ 

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> …
Run Code Online (Sandbox Code Playgroud)

c sockets linux udp broadcast

15
推荐指数
5
解决办法
4万
查看次数

可以通过TCP进行广播吗?

我正在用C编写服务器/客户端系统,它在TCP连接下使用BSD套接字.服务器是多线程的,每个连接都在自己的接收器中运行.每个客户端都能很好地与服务器进行一对一的交谈,遗憾的是我无法想到实现SendToAll()函数的方法,例如,如果客户端A做了需要发送数据包的事情.所有的客户.我该怎么做?

我正在考虑在每个接收器中实现一个队列,并将任何广播发送到这些队列; 当接收器发出一个新数据包时,它会将该消息添加到数据包中,如果这有意义的话.

但是,有没有办法通过TCP广播,就像你可以通过UDP?

c sockets networking tcp broadcast

15
推荐指数
2
解决办法
4万
查看次数

用Java检测所有可用网络的广播地址

对于我的项目,我希望获得所有可用广播地址的列表,以便我可以广播请求,而位于未指定网络中的其他计算机上的其他应用程序将响应并获取列表I(现在使用很少的修改版本和Mike的贡献想出了这个:


private ArrayList<InetAddress> getBroadcastAddresses() {
        ArrayList<InetAddress> listOfBroadcasts = new ArrayList();
        Enumeration list;
        try {
            list = NetworkInterface.getNetworkInterfaces();

            while(list.hasMoreElements()) {
                NetworkInterface iface = (NetworkInterface) list.nextElement();

                if(iface == null) continue;

                if(!iface.isLoopback() && iface.isUp()) {
                    System.out.println("Found non-loopback, up interface:" + iface);

                    Iterator it = iface.getInterfaceAddresses().iterator();
                    while (it.hasNext()) {
                        InterfaceAddress address = (InterfaceAddress) it.next();

                        System.out.println("Found address: " + address);

                        if(address == null) continue;
                        InetAddress broadcast = address.getBroadcast();
                        if(broadcast != null) listOfBroadcasts.add(broadcast);
                    }
                }
            }
        } catch (SocketException ex) {
            return new ArrayList<InetAddress>();
        } …
Run Code Online (Sandbox Code Playgroud)

java networking broadcast

15
推荐指数
1
解决办法
9303
查看次数

Java DatagramSocket将数据包发送到255.255.255.255失败

我正在编写一个java的网络程序,我想发送一些数据包到255.255.255.255,但它失败了,即使我发送到192.168.1.255,根据ifconfig命令的输出,是广播地址.但是当我把它们发送给我的队友的IP时,它运行正常.

这是我的程序的代码:

public class StackOverFlow {
    public static void main(String[] args) {
        Network net= new Network();

        Scanner input= new Scanner(System.in);
        while(input.hasNext())
          net.sendMessage(input.nextLine());
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用DatagarmSocket和DatagramPacket这样做了,这是我对网络的实现:

class Network {
DatagramSocket socket;

public Network() {
    try {
        socket = new DatagramSocket(8027);
        socket.setBroadcast(true);
        socket.connect(InetAddress.getByName("255.255.255.255"), 8027);
    } catch (Exception e) {
        System.err.println("Connection failed. " + e.getMessage());
    }
    listen();
}

public void listen() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    byte[] buf = new byte[1000];
                    DatagramPacket packet = new …
Run Code Online (Sandbox Code Playgroud)

java udp datagram broadcast

15
推荐指数
2
解决办法
2万
查看次数

打开设备上的屏幕

我怎样才能打开它?

我试过这样的事

adb -d  shell am broadcast -a android.intent.action.SCREEN_ON
Run Code Online (Sandbox Code Playgroud)

它真的应该工作,我发送广播意图它是由系统接收,但屏幕没有打开

我不明白是什么问题,是否可以通过代码转动设备的屏幕?我的意思是软件?因为似乎只需按下硬件按钮即可完成屏幕的打开...至少我得到了那个感觉,我错了吗?

android screen broadcast android-intent

14
推荐指数
4
解决办法
2万
查看次数

通过Wi-Fi Direct进行广播

我正在考虑通过多个Android设备之间的Wi-Fi Direct连接进行广播的可能性.我创建了一个简单的消息广播应用程序来测试它是否有效,但到目前为止我还没有能够广播消息.当我尝试发送数据包时,我得到一个SocketException(网络无法访问):

03-20 13:23:00.148: E/UdpBroadcaster(4180): sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180): java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.IoBridge.sendto(IoBridge.java:465)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at java.net.DatagramSocket.send(DatagramSocket.java:307)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at com.example.android.wifidirect.UdpBroadcaster.sendMessage(UdpBroadcaster.java:59)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at com.example.android.wifidirect.UdpBroadcaster.run(UdpBroadcaster.java:44)
03-20 13:23:00.148: E/UdpBroadcaster(4180): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.Posix.sendtoBytes(Native Method)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.Posix.sendto(Posix.java:146)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at …
Run Code Online (Sandbox Code Playgroud)

java android broadcast socketexception wifi-direct

14
推荐指数
1
解决办法
1万
查看次数

使用多个NIC广播UDP数据包

我正在为Linux中的摄像机控制器构建嵌入式系统(非实时).我在网络上做我想做的事情时遇到了问题.该系统有3个NIC,1个100base-T和2个千兆端口.我将较慢的一个连接到摄像机(这是所有它支持的),而较快的是与其他机器的点对点连接.我试图做的是从相机获取图像,进行一些处理,然后使用UDP将其广播到其他每个NIC.

这是我的网络配置:

eth0:addr:192.168.1.200 Bcast 192.168.1.255掩码:255.255.255.0(这是100base-t)
eth1:addr:192.168.2.100 Bcast 192.168.2.255掩码:255.255.255.0
eth2:addr:192.168.3.100 Bcast 192.168. 3.255面具:255.255.255.0

图像是通过专有协议从eth0进入的,所以它是一个原始套接字.我可以将它广播到eth1或eth2就好了.但是当我尝试将它一个接一个地广播到两者时,我在eth0上遇到了很多网络打嗝和错误.

我像这样初始化UDP套接字:

sock2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // Or sock3
sa.sin_family=AF_INET;
sa.sin_port=htons(8000);
inet_aton("192.168.2.255",&sa.sin_addr); // Or 192.168.3.255
setsockopt(sock2, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
bind(sock2,(sockaddr*)&sa,sizeof(sa));

sendto(sock2,&data,sizeof(data),0,(sockaddr*)&sa,sizeof(sa)); // sizeof(data)<1100 bytes
Run Code Online (Sandbox Code Playgroud)

我分别为每个插座执行此操作,并分别调用sendto.当我做其中一个时,没关系.当我尝试发送两者时,eth0开始收到坏包.

有关为什么会发生这种情况的任何想法?这是配置错误,还有更好的方法吗?

编辑:感谢所有的帮助,我一直在尝试一些事情,并进一步研究.严格来说,这个问题似乎并不是广播.我用单播命令替换了广播代码,它具有相同的行为.我想我更了解这种行为,但不知道如何解决它.

这是正在发生的事情.在eth0上我应该每50ms获得一个图像.当我在eth1(或2)上发送图像时,发送图像大约需要1.5ms.当我尝试同时发送eth1和eth2时,大约需要45ms,偶尔会跳到90ms.当这超出50ms窗口时,eth0的缓冲区开始构建.当然,当缓冲区满了时,我会丢失数据包.

所以我修改了问题.为什么从一个以太网端口转到两个端口,从1.5ms到45ms?

这是我的初始化代码:

sock[i]=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
sa[i].sin_family=AF_INET;
sa[i].sin_port=htons(8000);
inet_aton(ip,&sa[i].sin_addr);

//If Broadcasting
char buffer[]="eth1" // or eth2
setsockopt(sock[i],SOL_SOCKET,SO_BINDTODEVICE,buffer,5);
int b=1;
setsockopt(sock[i],SOL_SOCKET,SO_BROADCAST,&b,sizeof(b));
Run Code Online (Sandbox Code Playgroud)

这是我的发送代码:

for(i=0;i<65;i++) {
  sendto(sock[0],&data[i],sizeof(data),0,sa[0],sizeof(sa[0]));
  sendto(sock[1],&data[i],sizeof(data),0,sa[1],sizeof(sa[1]));
}
Run Code Online (Sandbox Code Playgroud)

这很基础.

有任何想法吗?感谢您的大力帮助!

保罗

c linux udp network-programming broadcast

13
推荐指数
1
解决办法
2393
查看次数

如果应用程序至少启动一次,广播接收器不能在ICS中工作

这个问题在堆栈溢出中已被问过几次,但还没有解决方案.我有一个广播接收器用于接收USB连接动作.广播接收器的责任是,如果我得到意图启动我的应用程序.在清单文件中我添加了接收器. 我在GingerBread中使用相同的逻辑,但我ICS无法正常工作. 许多问题,如 广播 - 不调用

1:Android启动BroadCast不调用广播密码- 不工作

如果我手动启动我的应用程序一次,那么从下次连接USB时,我的应用程序会自动启动.试图回答同样的问题,但没有回答.在ICS中有没有解决方案?

这是我的接收器

        <receiver android:name="com.test.MyReceiver">
                <intent-filter>
                    <action android:name="android.hardware.usb.action.USB_STATE" />
                    <action android:name="android.net.wifi.STATE_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                </intent-filter>
            </receiver>
    and this is my class
    public class MyReceiver extends BroadcastReceiver {
    .
    .
    .

  public void onReceive(Context context, Intent intent) {
.
Run Code Online (Sandbox Code Playgroud)

我错了吗?

提前谢谢 - 科兹洛夫

android broadcast broadcastreceiver android-intent android-4.0-ice-cream-sandwich

13
推荐指数
1
解决办法
7855
查看次数

Android如何在iOS中播放BLE本地名称?

我有一个Android应用广告数据广播数据与服务uuid​​和本地名称.问题是这个"本地名称"(又名蓝牙设备名称)限制为8个字符,每个字符是16位unicode表示,因此每个字符2个字节.每当我尝试将设备的名称更改为9个字符长时,由于错误1而导致播放无法启动

  public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;
Run Code Online (Sandbox Code Playgroud)

我知道GAP配置文件广播包长度为27个字节,7个用于标头,因此20个应该可以免费使用,而不仅仅是16个?

这是真正的泡菜,让我的镍发痒:

当iOS播放广告标题时,我将设备的完整本地名称作为ScanRecord的一部分,而不仅限于16字节.只是广播的一部分,我不是在这里建立GATT连接.

iOS如何做到这一点?例如,在我的Android上,我能够从iOS广告广播中检索14个字符,28个字节长的唯一ID.28字节长于蓝牙4.0标准规定的27字节限制.Android如何能够获取超过27个字节的完整广播?为什么我的"本地名称"或设备名称最多只能是8个字符或16个字节,否则将无法开始广播?

这是我的代码:

         final BluetoothLeAdvertiser advertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

        //advertise settings
        final AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
        settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
        settingsBuilder.setConnectable(true);
        settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);

        //advertise data
        AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
        ParcelUuid uuid = new ParcelUuid(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
        dataBuilder.addServiceUuid(uuid);

        mBluetoothAdapter.setName("12345678"); //8 characters works, 9+ fails
        dataBuilder.setIncludeDeviceName(true);

     if (advertiser!=null) {
         advertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), mAdvertiseCallback);
     } 

     mAdvertiseCallback = new AdvertiseCallback() {
         @Override
         public void onStartSuccess(AdvertiseSettings settingsInEffect) {
             super.onStartSuccess(settingsInEffect);
             Log.d(LOGN, "BLE STARTED ADVERTISING BROADCAST "+settingsInEffect);

         }

         @Override
         public void onStartFailure(int errorCode) …
Run Code Online (Sandbox Code Playgroud)

android bluetooth broadcast discovery ios

13
推荐指数
1
解决办法
3531
查看次数

使用LocalBroadcastManager进行"粘性"广播

我是否认为我无法使用LocalBroadcastManager发送"粘性"广播?如果是这样,这似乎是非常短视的,特别是如果应用程序使用可以在应用程序生命周期中交换进出的片段并依赖于广播数据.

android broadcast android-intent

11
推荐指数
2
解决办法
3950
查看次数