- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Ada 中试验 IP 多播,但似乎没有收到任何发送到多播组的流量。不知何故,我似乎无法让应用程序获取传入的数据包。
我可以验证(使用 Wireshark)多播加入是从我的计算机发送的,而且我还可以验证是否有数据正在发送到多播组。
我可以验证操作系统是否已通过 netsh 命令注册了多播加入:
netsh interfaces ip show joins
如果我运行我的程序,我的组将以 1 引用列出,否则为 0。
以下过程显示了我的监听器,我使用 Mcast_IP => "239.255.128.128"
和 Mcast_Port => "8807"
调用它:
with GNAT.Sockets;
with Ada.Streams;
with Ada.Text_IO;
procedure Receive_Multicast (Mcast_IP : in String;
Mcast_Port : in String)
is
package GS renames GNAT.Sockets;
package AS renames Ada.Streams;
package Tio renames Ada.Text_IO;
use GS;
use type Ada.Streams.Stream_Element_Offset;
Socket : GS.Socket_Type;
Address : GS.Sock_Addr_Type;
Data : AS.Stream_Element_Array (1 .. 2**16);
Offset : AS.Stream_Element_Offset;
Sender : GS.Sock_Addr_Type;
begin
Address.Addr := Any_Inet_Addr;
Address.Port := Port_Type'Value (Mcast_Port);
Create_Socket (Socket => Socket,
Family => Family_Inet,
Mode => Socket_Datagram);
Bind_Socket (Socket, Address);
-- Set socket options
Set_Socket_Option (Socket,
Socket_Level,
(Reuse_Address, True));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Multicast_TTL, 1));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Multicast_Loop, True));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Add_Membership, Inet_Addr (Mcast_IP), Any_Inet_Addr));
Tio.Put_Line ("Listening for MULTICASTS on port " & Address.Port'Img);
-- Receive the packet from the socket.
loop
Tio.Put_Line ("Waiting for incoming packets...");
Receive_Socket (Socket => Socket,
Item => Data,
Last => Offset,
From => Sender);
Tio.Put_Line ("Received " & Offset'Img & " bytes.");
end loop;
end Receive_Multicast;
该过程一直进行到 Receive_Socket
调用(这是 GNAT.Sockets
包中的一个过程)。但是,即使我可以使用 Wireshark 确认多播流量,对 Receive_Socket
的调用仍然阻塞。
更新/解决方案:
上面的代码确实有效,尽管我必须完全卸载卡巴斯基,这显然确实阻止了从我自己的机器发送的多播被接收(即环回)。接受的答案也确实完美无缺。
最佳答案
基于 GNAT.Sockets
中的示例,下面的代码应该可以工作。我删除了一些与接收无关的选项。
receive_multicast.ads
procedure Receive_Multicast
(IP_Address : String;
Port : String);
receive_multicast.adb
with Ada.Text_IO;
with Ada.Streams;
with GNAT.Sockets;
procedure Receive_Multicast
(IP_Address : String;
Port : String)
is
use GNAT.Sockets;
Address : Sock_Addr_Type;
Socket : Socket_Type;
begin
Create_Socket (Socket, Family_Inet, Socket_Datagram);
Set_Socket_Option
(Socket => Socket,
Level => Socket_Level,
Option => (Reuse_Address, True));
Address.Addr := Any_Inet_Addr;
Address.Port := Port_Type'Value (Port);
Bind_Socket (Socket, Address);
-- Join a multicast group
-- Portability note: On Windows, this option may be set only
-- on a bound socket.
Set_Socket_Option
(Socket => Socket,
Level => IP_Protocol_For_IP_Level,
Option => (Add_Membership, Inet_Addr (IP_Address), Any_Inet_Addr));
-- Receive the packet from the socket.
declare
use Ada.Text_IO;
use Ada.Streams;
Data : Stream_Element_Array (1 .. 2**16);
Offset : Stream_Element_Offset;
Sender : Sock_Addr_Type;
begin
Put_Line ("Waiting for incoming packets...");
Receive_Socket
(Socket => Socket,
Item => Data,
Last => Offset,
From => Sender);
Put_Line ("Received " & Offset'Image & " bytes.");
end;
end Receive_Multicast;
main.adb
with Receive_Multicast;
procedure Main is
begin
Receive_Multicast
(IP_Address => "239.255.128.128",
Port => "8807");
end Main;
我无法广泛测试代码,但当我打开 Windows PowerShell ISE 时,加载并运行脚本 Send-UdpDatagram.ps1
(参见 this GitHub Gist )然后执行:
PS C:\> Send-UdpDatagram -EndPoint "239.255.128.128" -Port 8807 -Message "testing"
然后 Ada 程序响应:
Waiting for incoming packets...
Received 7 bytes.
[2019-09-29 10:55:58] process terminated successfully, elapsed time: 07.60s
更新
我还使用运行 Raspbian GNU/Linux 10 (buster) 的 Raspberry Pi 测试了示例代码:
gnat
和 gprbuild
在树莓派上。gprbuild -p <proj_name>.gpr
) 编译它。结果是一样的:Raspberry Pi 上的所有四个程序实例都收到了数据包。当程序在等待数据包时,我可以看到成员资格(另请参阅 this 关于 SO 的帖子):
pi@raspberrypi:~ $ netstat -g
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
[...]
eth0 4 239.255.128.128
[...]
pi@raspberrypi:~ $ netstat -anu | sort -nk4
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
[...]
udp 0 0 0.0.0.0:8807 0.0.0.0:*
udp 0 0 0.0.0.0:8807 0.0.0.0:*
udp 0 0 0.0.0.0:8807 0.0.0.0:*
udp 0 0 0.0.0.0:8807 0.0.0.0:*
[...]
关于sockets - 使用 GNAT.Sockets 接收多播流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151208/
我正在使用 GNAT Programming Studio 更新一些 ada 文件。我有一个样式检查,对于这些旧文件,它会产生数以千计的警告。有用的是 GPS 在位置 View 中有一个小的自动修复“
我必须从C++客户端接收UDP数据报。客户端可以正常工作,并将数据报发送到我在其中编译此代码的ip。数据报的大小为800Bytes。当我发送数据报时,读取过程被阻止。我已经根据以下示例创建了此代码:h
有没有办法用 GNAT.Sockets 获取 MAC 地址? 我已经多次阅读 .ads 文件,但没有看到任何看起来会产生 MAC 地址的内容。 Ads here 最佳答案 在谷歌搜索您的问题时,我找到
我有一个包含多个构建配置的 Gnat/Gprbuild 项目。我有一个主要源文件和一个辅助广告文件,其中主要源文件包括: with Secondary_File; use Secondary_File
编译失败并显示以下 F6 声明: type F3 is delta 2.0**(-4) range 0.0 .. ((2.0**8)-1.0)*2.0**(-4); -- byte 16#f.
我正在尝试使用 GNAT 95 在我的计算机上使用 GNAT-GPL 2015 bundle 编译运行 CENTOS 7 64 位的程序.我收到如下所示的编译器消息: gprbuild: encaps
我需要一个将在后台静默运行但仍与当前用户的桌面交互且不是服务的应用程序。 我希望应用程序在不生成标准输出控制台的情况下启动。 在C中,好像是用Kernel32.dll中的FreeConsole完成的,
我想知道 GNAT 支持哪些 CPU 架构,尤其是在嵌入式领域。 Gnu C 编译器支持的每个目标是否也自动支持 Ada? 最佳答案 AdaCore 的 Embedded Development Pa
在我正在处理的这个多语言 GPRBuild 项目中,我有一些 C++ 库文件 (*.a) 我需要链接到我的可执行文件中。是否有一个 gpr 属性来告诉它链接什么或无论如何将 -l -L 开关传递给链接
所以我正在开发一个 Ada 2012 库,它不应该从默认池中执行分配;所有这些都应该使用用户指定的存储池。 我正在使用一些预定义的包,其中一些显然不遵守规则:例如无限期容器。我想确定我没有使用我不应该
此(声明)代码引发存储错误: type Vector is array (Integer range <>) of Integer; type Array_Starting_At_One (Max :
我有 Ada 程序,可以使用 GNAT - GPS 完美运行和编译。当我运行其 exe 文件并提供用户输入时,该 exe 会立即关闭,而不是说“按任意键继续”。 我在网上搜索了很多,但我只找到了与使用
为了了解 Ada 程序编译背后的过程(不诉诸使用 gpr ),我决定手动编译我的一个项目。为了编译程序,我在每个 .adb 上运行以下命令文件(但是不是手动): $ gcc -c src/.adb -
所以我一直在玩 Ada 一段时间,它是一种很棒的语言,但我不知道如何使可执行文件更小(我在 Windows 上使用 GNAT 5.3)。目前,hello world 的文件大小约为 800 kb。当我
为了了解 Ada 程序编译背后的过程(不诉诸使用 gpr ),我决定手动编译我的一个项目。为了编译程序,我在每个 .adb 上运行以下命令文件(但是不是手动): $ gcc -c src/.adb -
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我相信我已经发现并修复了 AUnit 中的一个错误,它是 Ada 的 GNAT 编译器工具的一部分。 向 AdaCore 提交 GNAT 工具社区版本错误的最佳方式是什么? 以下程序使用当前版本的编译
这是一个聊天客户端/服务器程序。要进行广播,我必须保存每个连接的客户端,然后写入每个客户端,对吗?管理客户的最佳实践是什么? GNAT.Sockets.Accept_Socket(
documentation for Gnat test 展示了如何生成一个线束和骨架单元测试。它为目标项目中的每个公共(public)函数创建一个单元测试,但是如果我添加另一个单元测试,当我重新生成线
我正在 Ada 中试验 IP 多播,但似乎没有收到任何发送到多播组的流量。不知何故,我似乎无法让应用程序获取传入的数据包。 我可以验证(使用 Wireshark)多播加入是从我的计算机发送的,而且我还
我是一名优秀的程序员,十分优秀!