标签: broadcast

接收来自N个客户端的响应,以响应UDP上的广播请求

我正在为特定类型的网络多媒体设备实现一种IP查找器.我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节.

该设备有自己的设备发现方式.

它的工作原理如下:客户端通过UDP通过LAN发送广播请求.
目标端口号是固定的.
作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息.

我正在使用sendto()广播UDP请求消息.

现在我的问题是我不知道有多少设备(ieservers)会响应请求.

我需要多少次调用recvfrom()?
我什么时候才能知道我已经处理了所有设备的响应?
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
有没有更好的(或者如果我错在这里是正确的)完成相同的方式?

我正在用C/C++编程,计划为Windows和Linux编写代码.
提前谢谢了.

编辑:所以在这里的所有网络编程向导的帮助下,我找到了解决我的问题的方法:)
select()对我来说就是这样的事情...非常
感谢所有花时间帮忙的人我

c c++ sockets udp broadcast

6
推荐指数
1
解决办法
2489
查看次数

Java中的UDP广播

早上.

我是Java和套接字连接的新手,但我试图在端口8001上将255.255.255.255上的UDP数据包/广播发送到设备.我可以将数据发送得很好,但是当接收数据时,连接超时.我有一个数据包嗅探器,我可以看到数据包发送,然后设备响应.

我很确定这是我在代码中遗漏的新手错误,但我已经坚持了一段时间,任何帮助都会受到赞赏.

 m_Socket = new DatagramSocket(m_SERVERPORT);
 InetAddress address = InetAddress.getByName(m_SERVERIP);


 m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length,
 address, m_SERVERPORT);
 m_Socket.setBroadcast(true);
 m_Socket.connect(address, m_SERVERPORT);

 m_Socket.send(m_DataPack);
 m_DataPack = new DatagramPacket(data, data.length,
 address, m_SERVERPORT);


 m_Socket.receive(m_DataPack); // This is where it times out


 data = m_DataPack.getData();
 String received = data.toString();
 System.out.println("Received: " + received);
 m_Socket.close();
Run Code Online (Sandbox Code Playgroud)

谢谢和Gig'Em.

编辑:

我不确定这是否有帮助但是当我观察m_Socket对象时,我可以在发送之前看到以下内容:

bound = true;
close = false;
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1);
connectedPort = 8001;
connectState = 1;
created = true;
impl = PlainDatagramSocketImpl;
oldImpl = false; …
Run Code Online (Sandbox Code Playgroud)

java udp broadcast

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

如何确定Broadcast Intent的发送者

我有一个应用程序,同时是标准动作android.intent.action.SET_WALLPAPER的广播发送者和接收者.我只想在另一个应用程序广播此意图的情况下做一些事情.

有没有办法确定谁在BroadcastReceiver的onReceive方法中发起广播?

android broadcast broadcastreceiver android-intent

6
推荐指数
2
解决办法
4489
查看次数

中止/取消广播

我想要的是:我想成为第一个接收短信广播的人,如果短信只是我感兴趣的话我想取消广播,这样广播就不会到达任何其他应用程序/接收者(默认消息应用程序等) .我所知道的是:

  • SmsDisptacher.java使用可以取消/中止的orderedBroadcasts.

我不知道的是:

  • 如果orderedBrodcasts可以取消其他应用程序/接收器,即除了你自己.

我试图成为第一个接收广播的人:

  • intent-filter android:priority ="1000"

我已经尝试取消广播了:

  • AbortBroadcast();
  • broadcastReceiver.setResultCode(RESULT_CANCELED)
  • clearAbortBroadcast()

sms android broadcast

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

在C#中接收UDP广播消息

我知道很多次都会问过这个问题.我已经阅读了所有答案并尝试了一些我能找到的代码.几天后,我非常绝望,我不得不向你寻求帮助.

我的家庭网络中有一台设备和一台PC.设备发送UDP广播消息.在我的电脑上,我可以在wireshark中看到这些消息:

来源目的地长度

192.168.1.102 0.0.0.0 UDP 60源端口:9050目标端口:0

这意味着数据包到达我的PC.我的下一步是创建一个接收这些数据包的C#应用​​程序.如上所述,我尝试了所有可能的解决方案,但它不会收到任何东西.

所以我想必须有一些非常基本的我做错了.谁能帮我吗?谢谢!

c# udp broadcast udpclient wireshark

6
推荐指数
1
解决办法
2653
查看次数

发送和接收UDP数据包

以下代码在端口15000上发送数据包:

int port = 15000;
UdpClient udp = new UdpClient();
//udp.EnableBroadcast = true;  //This was suggested in a now deleted answer
IPEndPoint groupEP = new IPEndPoint(IPAddress.Broadcast, port);
string str4 = "I want to receive this!";
byte[] sendBytes4 = Encoding.ASCII.GetBytes(str4);
udp.Send(sendBytes4, sendBytes4.Length, groupEP);
udp.Close();
Run Code Online (Sandbox Code Playgroud)

但是,如果我不能在另一台计算机上接收它,那就没用了.我所需要的只是将命令发送到局域网上的另一台计算机,并让它接收它并做一些事情.

不使用Pcap库,有什么办法可以实现这个目标吗?我的程序正在与之通信的计算机是Windows XP 32位,而发送计算机是Windows 7 64位,如果它有所不同.我已经研究了各种net send命令,但我无法解决它们.

我也可以访问计算机(XP one)的本地IP,因为它可以在其上物理输入'ipconfig'.

编辑:这是我正在使用的接收功能,从某处复制:

public void ReceiveBroadcast(int port)
{
    Debug.WriteLine("Trying to receive...");
    UdpClient client = null;
    try
    {
        client = new UdpClient(port);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message); …
Run Code Online (Sandbox Code Playgroud)

c# message udp broadcast packet

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

使用Server-Sent事件广播消息

我想实现一个简单的Server-Sent事件应用程序,客户端监听这样的php文件

<script src="eventsource.js"></script>
<script>
  var es = new EventSource('../sse.php');

  es.onmessage = function (event) {
    var data = JSON.parse(event.data);
    console.log('msg: ' + event.data);
  };

  es.onopen = function () {
    console.log('connected');
  }
</script>
Run Code Online (Sandbox Code Playgroud)

但后来我需要能够广播一条消息,每个连接的客户端同时获取它.

php文件将被另一个请求触发,它会将一些SSE数据"回显"给所有客户端.

这可能吗?我可以采取另一条路线吗?

先感谢您

php sockets html5 broadcast server-sent-events

6
推荐指数
1
解决办法
4984
查看次数

在Android上接收广播消息

首先 - 抱歉我的英语,我不是"本土作家".

我正在用C++发送广播消息,并希望在Android设备上接收它.我创建了这样的代码:

    System.out.println("receiveBroadcast()");
    DatagramSocket socket = new DatagramSocket(3866);
    socket.setBroadcast(true);
    System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast());
    byte[] buf = new byte[512];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    while (true) {
      System.out.println("Waiting for data");
      socket.receive(packet);
      System.out.println(packet.getAddress());
      System.out.println("Data received");
    }
Run Code Online (Sandbox Code Playgroud)

当我将其编译为标准的Java SE控制台应用程序并在连接到网络的其他计算机上运行时,它可以工作.它不适用于Android,我不知道为什么.在Android上它只是等待数据但从未收到它:

03-18 15:47:05.045: I/System.out(16651): receiveBroadcast()
03-18 15:47:05.055: I/System.out(16651): Listen on /:: from null port true
03-18 15:47:05.065: I/System.out(16651): Waiting for data
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我在Windows系统下将其作为标准Java控制台应用程序运行时,而不是"侦听/ ::从null端口为真"我得到"从空端口侦听0.0.0.0/0.0.0.0上的真实".

我有清单这样的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" …
Run Code Online (Sandbox Code Playgroud)

java sockets android udp broadcast

6
推荐指数
1
解决办法
2819
查看次数

Linux上的快速用户空间进程间通知方法?

我们有两个Linux进程与域套接字通信,性能目标是5k iops,通过单域套接字连接有4k请求大小,为了降低cpu成本我们用io-ring(基于共享内存)替换域套接字,但关键"通知"步骤仍由域套接字实现,似乎开销仍然太大.

PS:目前io深度通常为2-4,表示每个"通知"1k iops

信号量,pthread_condvars,基于futex的锁,eventfd,inotify,你喜欢哪一个(或其他任何人),我非常关心性能和开销.谢谢!

linux performance ipc broadcast futex

6
推荐指数
1
解决办法
736
查看次数

BroadcastHub过滤基于"资源"连接的客户端正在进行?

我正在编写一个纯websocket web应用程序,这意味着在websocket升级之前没有用户/客户端步骤,更具体地说:身份验证请求和其他通信一样遍历websockets

有/是:

  • / api/ws上只有一个websocket端点
  • 连接到该端点的多个客户端
  • 多个客户的多个项目

现在,并非每个客户端都可以访问每个项目 - 对它的访问控制是在服务器端(ofc)实现的,并且与websockets本身无关.

我的问题是,我希望允许协作,这意味着N个客户可以一起处理1个项目.

现在,如果其中一个客户端修改了某些内容,我想通知正在处理该项目的所有其他客户端.

这一点尤其重要,因为atm我是唯一一个正在研究这个并进行测试的人,这是我身上的重大疏忽,因为现在:

如果客户端A连接到Project X并且客户端B连接到Proejct Y,如果其中任何一个在其各自的项目中更新某些内容,则另一个会收到有关这些更改的通知.

现在我的WebsocketController相当简单,我基本上有这个:

private val fanIn = MergeHub.source[AllowedWSMessage].to(sink).run()
private val fanOut = source.toMat(BroadcastHub.sink[AllowedWSMessage])(Keep.right).run()

def handle: WebSocket = WebSocket.accept[AllowedWSMessage, AllowedWSMessage]
{
  _ => Flow.fromSinkAndSource(fanIn, fanOut)
}
Run Code Online (Sandbox Code Playgroud)

现在从我的理解,我需要的是

1)每个项目有多个websocket端点,例如/ api/{project_identifier}/ws

(X)或

2)根据他们正在工作的项目拆分WebSocket连接/连接客户端的一些方法.

因为我不想去路线1)我将分享我的想法2):

我现在没有看到解决方法的问题是,我可以在服务器端轻松创建一些集合,在那里我存储哪个用户在任何给定时刻处理哪个项目(例如,如果他们选择/切换项目,客户端将其发送到服务器并存储此信息)

但我仍然有那个fanOut,所以这不会解决我在WebSocket/AkkaStreams方面的问题.

是否有一些魔法(过滤)被调用,BroadcastHub这是我想要的?

编辑:现在在这里共享我的整个websocket逻辑,尝试后但未能应用@James Roper的良好提示:

 class WebSocketController @Inject()(implicit cc: ControllerComponents, ec: ExecutionContext, system: ActorSystem, mat: Materializer) extends AbstractController(cc)
Run Code Online (Sandbox Code Playgroud)

{val logger:Logger = Logger(this.getClass())

type WebSocketMessage = Array[Byte]

import scala.concurrent.duration._

val tickingSource: Source[WebSocketMessage, …
Run Code Online (Sandbox Code Playgroud)

broadcast websocket akka playframework akka-stream

6
推荐指数
1
解决办法
252
查看次数