Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 带Indy套接字的UDP广播:如何选择正确的接口?_Sockets_Networking_Udp_Indy_C++builder 2006 - Fatal编程技术网

Sockets 带Indy套接字的UDP广播:如何选择正确的接口?

Sockets 带Indy套接字的UDP广播:如何选择正确的接口?,sockets,networking,udp,indy,c++builder-2006,Sockets,Networking,Udp,Indy,C++builder 2006,使用C++Builder2006 我正在修改一个旧的小程序,它可以执行以下操作: 发送UDP广播消息(使用255.255.255.255地址) 从所有连接的设备(配备RabbitCore RCM3200的硬件人员)获取答案 (可选)广播另一条UDP消息,其中包含其中一个设备的MAC地址以及该设备必须为自身设置的正确网络配置 (这是因为设备在安装时可能有错误的IP/网络掩码,并且需要一种独立于IP的方法来设置它。 这是设备生产商提供的一种行之有效的方法,因此无法更改,我只是描述我正在做的事情) 我

使用C++Builder2006

我正在修改一个旧的小程序,它可以执行以下操作:

  • 发送UDP广播消息(使用255.255.255.255地址)
  • 从所有连接的设备(配备RabbitCore RCM3200的硬件人员)获取答案
  • (可选)广播另一条UDP消息,其中包含其中一个设备的MAC地址以及该设备必须为自身设置的正确网络配置
  • (这是因为设备在安装时可能有错误的IP/网络掩码,并且需要一种独立于IP的方法来设置它。 这是设备生产商提供的一种行之有效的方法,因此无法更改,我只是描述我正在做的事情)

    我面临的问题描述得很好:简言之,Win7不通过所有接口发送UDP消息,而只通过"首选"接口。 由于该程序是使用Indy UDPClient套接字(TIdUDPClient)构建的,因此我希望保持原样

    问题:

  • 有没有办法“强制”UDP套接字通过特定的网络接口发送?通过这种方式,我可以“手动”循环并将广播发送到所有(相关)网络
  • 如果不是。。。。我应该怎么做才能获得相同的结果
  • 有没有办法“强制”UDP套接字通过特定的网络接口发送

    TIdUDPClient
    有一个
    BoundIP
    属性用于该确切目的。每次要更改
    BoundIP
    ,都必须调用
    TIdUDPClient.Binding.CloseSocket()
    ,除非为每个适配器绑定不同的
    TIdUDPClient
    对象

    通过这种方式,我可以“手动”循环并将广播发送到所有(相关)网络


    根据您使用的Indy的版本,您可以使用
    TIdStack.LocalAddresses
    属性,或者
    TIdStack.AddLocalAddressesToList()
    TIdStack.GetLocalAddressList()
    方法来获取可用的本地IP地址列表,然后您可以循环使用。

    可能我还不清楚,对不起:“由于该程序是使用Indy UDPClient套接字(TIdUDPClient)构建的,因此我希望保持原样。“这意味着我想找到一个仍然使用Indy组件的解决方案,而不是我想让应用程序只使用一个界面发送广播消息。谢谢。但是我找不到使用TidStack的方法。那个类本身是不可实例化的,因为它是抽象的,我不能定义派生窗口。。。我也尝试过(正如我发现的那样)GStack变量,但我不知道它在哪里声明(显然不在IdGlobal.hpp中)@FabioCalzolari全局
    GIdStack
    对象指针在
    IdStack.hpp
    头中声明。Indy 10中的
    TIdUDPClient
    中有一个
    BoundIP
    属性。您正在使用Indy 9吗?是的,Indy 9包含在BCB2006中。
    TIdUDPClient
    不支持绑定到Indy 9中的特定接口。但是您可以通过从
    TIdUDPClient
    派生并重写虚拟
    GetBinding()
    方法来添加它。