我正在为特定类型的网络多媒体设备实现一种IP查找器.我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节.
该设备有自己的设备发现方式.
它的工作原理如下:客户端通过UDP通过LAN发送广播请求.
目标端口号是固定的.
作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息.
我正在使用sendto()广播UDP请求消息.
现在我的问题是我不知道有多少设备(ieservers)会响应请求.
我需要多少次调用recvfrom()?
我什么时候才能知道我已经处理了所有设备的响应?
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
有没有更好的(或者如果我错在这里是正确的)完成相同的方式?
我正在用C/C++编程,计划为Windows和Linux编写代码.
提前谢谢了.
编辑:所以在这里的所有网络编程向导的帮助下,我找到了解决我的问题的方法:)
select()对我来说就是这样的事情...非常
感谢所有花时间帮忙的人我
早上.
我是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) 我有一个应用程序,同时是标准动作android.intent.action.SET_WALLPAPER的广播发送者和接收者.我只想在另一个应用程序广播此意图的情况下做一些事情.
有没有办法确定谁在BroadcastReceiver的onReceive方法中发起广播?
我想要的是:我想成为第一个接收短信广播的人,如果短信只是我感兴趣的话我想取消广播,这样广播就不会到达任何其他应用程序/接收者(默认消息应用程序等) .我所知道的是:
我不知道的是:
我试图成为第一个接收广播的人:
我已经尝试取消广播了:
我知道很多次都会问过这个问题.我已经阅读了所有答案并尝试了一些我能找到的代码.几天后,我非常绝望,我不得不向你寻求帮助.
我的家庭网络中有一台设备和一台PC.设备发送UDP广播消息.在我的电脑上,我可以在wireshark中看到这些消息:
来源目的地长度
192.168.1.102 0.0.0.0 UDP 60源端口:9050目标端口:0
这意味着数据包到达我的PC.我的下一步是创建一个接收这些数据包的C#应用程序.如上所述,我尝试了所有可能的解决方案,但它不会收到任何东西.
所以我想必须有一些非常基本的我做错了.谁能帮我吗?谢谢!
以下代码在端口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) 我想实现一个简单的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数据"回显"给所有客户端.
这可能吗?我可以采取另一条路线吗?
先感谢您
首先 - 抱歉我的英语,我不是"本土作家".
我正在用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) 我们有两个Linux进程与域套接字通信,性能目标是5k iops,通过单域套接字连接有4k请求大小,为了降低cpu成本我们用io-ring(基于共享内存)替换域套接字,但关键"通知"步骤仍由域套接字实现,似乎开销仍然太大.
PS:目前io深度通常为2-4,表示每个"通知"1k iops
信号量,pthread_condvars,基于futex的锁,eventfd,inotify,你喜欢哪一个(或其他任何人),我非常关心性能和开销.谢谢!
我正在编写一个纯websocket web应用程序,这意味着在websocket升级之前没有用户/客户端步骤,更具体地说:身份验证请求和其他通信一样遍历websockets
有/是:
现在,并非每个客户端都可以访问每个项目 - 对它的访问控制是在服务器端(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)