我试图使一组应用程序使用UDP和广播消息发现彼此.应用程序将定期发送一个UDP数据包,说明它们是谁以及它们可以做什么.最初我们只用于广播到INADDR_BROADCAST.
所有应用程序共享同一个端口进行监听(因此SO_REUSEADDR).事件内核对象附加到套接字,因此当我们可以获取新数据包并在WaitFor循环中使用它时,我们会收到通知.套接字用于异步.
打开插座:
FBroadcastSocket := socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if FBroadcastSocket = INVALID_SOCKET then Exit;
i := 1;
setsockopt( FBroadcastSocket, SOL_SOCKET, SO_REUSEADDR, Pointer( @i ), sizeof( i ) );
i := 1;
setsockopt( FBroadcastSocket, SOL_SOCKET, SO_BROADCAST, Pointer( @i ), sizeof( i ) );
System.FillChar( A, sizeof( A ), 0 );
A.sin_family := AF_INET;
A.sin_port := htons( FBroadcastPort );
A.sin_addr.S_addr := INADDR_ANY;
if bind( FBroadcastSocket, A, sizeof( A ) ) = SOCKET_ERROR then begin
CloseBroadcastSocket();
Exit;
end;
WSAEventSelect( FBroadcastSocket, FBroadcastEvent, …Run Code Online (Sandbox Code Playgroud) 我想在我的Android应用程序中使用sendOrderedBroadcast.
我希望能够将Intent从我的一个应用程序发送到另一个应用程序,然后我想从收到Intent的应用程序中获取数据,在这种情况下是布尔值true或false.
这是当前的代码:
Intent i = new Intent();
i.setAction(GlobalData.PROPOSE_IN_DOMAIN_ROAM_INTENT);
i.putExtra("com.testnetworks.QCLEVEL", aProposedTheoreticalQoSLevel);
sendOrderedBroadcast(i, null, null, null, Activity.RESULT_OK, null, null);
Run Code Online (Sandbox Code Playgroud)
这是实现我想要的正确方法吗?
如果是这样,我将什么用作resultReceiver*参数?(第3个参数)
然后我如何从广播中收回数据?
我做了一个快速的谷歌,没有提出任何例子,任何帮助或例子非常感谢.
更新的代码:
sendOrderedBroadcast(i, null, domainBroadcast, null, Activity.RESULT_OK, null, null);
Run Code Online (Sandbox Code Playgroud)
class DomainBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent intent) {
String action = intent.getAction();
if(GlobalData.PROPOSE_IN_DOMAIN_ROAM_INTENT.equals(action)){
Log.d("BROADCAST", "Returning broadcast");
Bundle b = intent.getExtras();
Log.d("BROADCAST", "Returning broadcast " +
b.getInt("com.testnetworks.INT_TEST"));
}
}
Run Code Online (Sandbox Code Playgroud)
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(GlobalData.PROPOSE_IN_DOMAIN_ROAM_INTENT.equals(action)){
Bundle b = …Run Code Online (Sandbox Code Playgroud) 几乎在每个可用的UNIX系统上使用ping时,ping广播地址很简单:
$ ping 192.168.11.255
Run Code Online (Sandbox Code Playgroud)
但是,当在Linux上完成此操作时,会发生非标准(并且持续恼人!)响应:
$ ping 192.168.11.255
Do you want to ping broadcast? Then -b
Run Code Online (Sandbox Code Playgroud)
自从我第一次看到它以来,这让我一直没有尽头 - Linux ping不习惯这样.我搜索了这个开关的来源,无法找到它进入或任何讨论为什么它是必要的.
似乎这个开关甚至不够用:
$ ping -b 192.168.11.255
WARNING: pinging broadcast address
PING 192.168.11.255 (192.168.11.255) 56(84) bytes of data.
64 bytes from 192.168.11.22: icmp_seq=1 ttl=64 time=0.225 ms
Run Code Online (Sandbox Code Playgroud)
这真的有必要吗?编写一个修补Linux ping的补丁非常诱人,所以它的工作方式应该......
我无法相信没有其他人抱怨过,但如果他们这样做,我就无法在Google上找到它.
我有AsyncUdpSocket的问题.
我曾经连接到服务器,发送一些数据并获得一些响应.现在因为我不知道服务器的实际地址,我不得不更改我的代码并将数据发送到广播地址255.255.255.255.
这是我的代码:
NSString *bchost = @"255.255.255.255";
NSString *host = @"10.1.0.1";
int udpPort = 6001;
AsyncUdpSocket *udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToPort:udpPort error:nil];
[udpSocket enableBroadcast:YES error:nil];
NSError *error = nil;
if ([udpSocket connectToHost:bchost onPort:udpPort error:&error])
{
[udpSocket receiveWithTimeout:10 tag:0];
[self sendToUDPServer:@"HELLO"];
}
Run Code Online (Sandbox Code Playgroud)
所以,问题在于它适用于"主机"而不适用于"bchost".在这两种情况下,我在服务器端看到接收到数据并且答案被发送到发送方的地址(应该是iOS设备),但是在设备上,当我将数据发送到bchost时,我没有得到数据.
知道我错过了什么吗?
根据MSDN文档, Mango不支持UDP广播.根据这个线程,它在某种程度上是可能的.有人在Phone 7上有过UDP的经验吗?C#中的代码片段将不胜感激.
编辑:我们做了一些进一步的调查.以下代码似乎有效
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
byte[] data = Encoding.UTF8.GetBytes("test data");
SocketAsyncEventArgs a = new SocketAsyncEventArgs();
a.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, 11000);
a.SetBuffer(data, 0, data.Length);
a.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
Console.WriteLine(e.SocketError);
// here you can call socket.SendToAsync(sendEventArgs);
});
socket.ConnectToAsync(a);
Run Code Online (Sandbox Code Playgroud)
必须在SendToAsync之前调用ConnectToAsync,否则会出现访问被拒绝的异常.UDP似乎以某种方式工作,至少在模拟器中.问题是,它是否会在现实中起作用,为什么文档说它没有?
我想在不使用自己的广播公司的情况下向SHOUTcast或Icecast服务器提供音频数据,因为我将在包括移动设备在内的各种平台上使用它.
我需要协议描述,开源项目或样本,以便能够使用Objective-C,C或C++将音频数据(从麦克风或文件)发送到SHOUTcast和Icecast服务器.
在哪里可以找到构建正确的SHOUTcast/Icecast源客户端所需的信息?
有人知道是否有能力将帧缓冲区从广播上传扩展上传到主机应用程序,或者我应该将它们直接加载到后端?我的目标是从重放工具包拦截帧缓冲区,将它们发送到我的应用程序并使用Webrtc通过我的应用程序广播视频.将不胜感激任何帮助.提前致谢.
我正在尝试编写一个类似于CamTwist的功能,可以将视频文件(在硬盘上)作为视频输入广播到其他应用程序.
但是,我不知道从哪里开始..也不是很有帮助.
一点指导可能有用.:)
我正在开发一个Android应用程序,它向局域网上的设备发送udp广播消息.应用程序在设备上以及在Windows上运行的模拟器上运行良好.但是,我无法让它在Linux和Mac Android Emulators上运行.
由于255.255.255.255不能在android上运行,我使用子网掩码计算广播ip.(在我的情况下,广播IP是192.168.1.255,其中主机IP是192.168.1.88/24).但邮件永远不会发送.还检查了Wireshark,但似乎udp包没有进入模拟器之外.
是否有人在Linux Android Emulator上发送广播消息?
任何建议将受到高度赞赏.
我想合并2个数据帧与广播关系:没有公共索引,只想找到2个数据帧中的所有行对.所以想要使N行数据帧x M行dataframe = N*M行数据帧.有没有规则可以在不使用itertool的情况下实现这一目标?
DF1=
id quantity
0 1 20
1 2 23
DF2=
name part
0 'A' 3
1 'B' 4
2 'C' 5
DF_merged=
id quantity name part
0 1 20 'A' 3
1 1 20 'B' 4
2 1 20 'C' 5
3 2 23 'A' 3
4 2 23 'B' 4
5 2 23 'C' 5
Run Code Online (Sandbox Code Playgroud)