delphi 为什么使用TIdUDPClient发送UDP广播数据包只能在某些设备上工作?

h6my8fg2  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(273)

我试图在我的本地网络中发送UDP数据包到所有设备,我试图使用相同的(FMX)应用程序从不同的设备发送数据包。但由于某种原因,它只在某些设备上工作,而在其他设备上则不行。
示例代码:

IdUDPClient1.BroadcastEnabled := true;
IdUDPClient1.Broadcast('MyApp Discover Packet', 25168);

字符串
根据Indy手册,这应该将数据发送到广播地址255.255.255.255
当我将这个编译为一个移动的应用程序并运行它时,它确实从我的手机(Android设备)在同一个网络上完美地工作。我在我的电脑上用Wireshark验证了我的电脑收到了数据包。但是当我把同一个应用程序编译成Windows(64位)应用程序并在我的PC上运行时,它似乎什么也没做。没有错误,Wireshark甚至不显示网络上的传出数据包,就像它从未发送过一样。然而,如果我在PC上的同一个应用程序中的同一个端口上侦听,我确实会收到UDP数据包-不像从我移动的,它们只是从来没有发送到网络。我做错了什么?
如果使用当前子网的广播地址更好(例如192.168.0.255),那么获得它的最佳方法是什么?例如,Indy是否提供了一种列出所有网络适配器及其IP地址和子掩码的方法?

bprjcwpo

bprjcwpo1#

使用当前子网的广播地址会更好吗(例如192.168.0.255)
是的,特别是因为某些路由器实际上默认阻止255.255.255.255上的一般广播,但不阻止特定于子网的广播。
另外,请注意,UDP广播仅适用于IPv4。IPv6不支持广播,所以你必须使用多播。
最好的办法是什么?例如,Indy是否提供了一种列出所有网络适配器及其IP地址和子掩码的方法?
是的,通过全局GStack对象的TIdStack.GetLocalAddressList()方法,例如:

uses
  ..., IdStack;

var
  ...
  List: TIdStackLocalAddressList;
  Addr: TIdStackLocalAddress;
  Addr4: TIdStackLocalAddressIPv4;
  Addr6: TIdStackLocalAddressIPv6;
  I: integer;
begin
  ...
  // you can omit (Inc|Dec)Usage if you have
  // other Indy components already instantiated... 
  TIdStack.IncUsage;
  try
    List := TIdStackLocalAddressList.Create;
    try
      GStack.GetLocalAddressList(List);
      for I := 0 to List.Count-1 do
      begin
        Addr := List[i];
        case Addr.IPVersion of
          Id_IPv4: begin
            Addr4 := TIdStackLocalAddressIPv4(Addr);
            // use Addr4.IPAddress and Addr4.SubNetMask as needed...
          end;
          Id_IPv6: begin
            Addr6 := TIdStackLocalAddressIPv6(Addr);
            // use Addr6 as needed...
          end;
        end;
      end;
    finally
      List.Free;
    end;
  finally
    TIdStack.DecUsage;
  end;
  ...
end;

字符串

相关问题