gpt4 book ai didi

c++ - 为以太网适配器设置自定义 ip 时无法绑定(bind)套接字

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:15 25 4
gpt4 key购买 nike

问题

在我们运行 RTEMS 4.9.2 的系统上,我们遇到了一个非常奇怪的套接字通信问题。我们正在设置套接字并使用以下命令进行绑定(bind):

// Bind the socket to set the local port
sockaddr_in localSocketAddress = {0};
localSocketAddress.sin_family = AF_INET;
localSocketAddress.sin_port = (u_short)localPort;
localSocketAddress.sin_addr.s_addr = localAddress;

if (bind( mSocket, (sockaddr *)&localSocketAddress, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
int errorOut = errno;
...

这适用于 UDP 通信,但在下面解释的奇怪的特定情况下除外。我们遇到的问题是此 bind 调用失败,即使设置正确。我们收到错误 125,对于 RTEMS 是 EADDRNOTAVAIL:

A nonexistent interface was requested or the requested address was not local.

表面原因

在设备启动时,我们可以通过以下两种方式之一设置网络:

  1. 网络 IP 和子网是根据默认引导加载程序 (UBOOT) 中的内容自动配置的,并通过 RTEMS 操作系统设置。

  2. 调用 RTEMS 函数 rtems_bsdnet_ifconfig 以在启动时间后更改唯一以太网接口(interface)的 IP 地址。

为了澄清,选项 2 是这样调用的:

rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);

如果网络按照选项 1 的指示设置,一切都按预期工作,但如果使用选项 2(即使设置与选项 1 定义的网络选项匹配),套接字绑定(bind)也会失败。

RTEMS 是否有已知原因或错误表明如果您重新配置 IP,此绑定(bind)将失败?

附加信息

  • 我们正在使用本质上使用 ioctl("eht1", SIOCSIFADDR, ...) 的方法设置新的 IP 地址(选项 2)。

    <
  • 如果我们绑定(bind)我们的套接字而不指定本地地址(即使用INADDR_ANY)那么它在任何情况下都有效。

  • rtems_bsdnet_ifconfigioctl 函数的简单接口(interface)。它来自 rtems_glue.c 并具有函数签名 int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)

  • 除了这个绑定(bind)之外,所有正常的网络功能似乎都能正常工作。

  • 看了this之后我想也许我需要做更多的事情来重置我的 IP 地址。但这不起作用,使用第一个答案或什至对 SIOCSIFFLAGS 做任何事情都会导致所有网络功能停止。

最佳答案

你没有提到你正在运行的体系结构,但你正在以本地字节顺序设置端口和地址,这可能与网络字节顺序不同。我首先要尝试的是:

localSocketAddress.sin_port = htons (localPort);
localSocketAddress.sin_addr.s_addr = htonl (localAddress);

这也将使您的代码更具可移植性,以防万一这不是您的问题(即您在大端主机上运行)并且有一天您尝试在不同的小端系统上编译。

关于c++ - 为以太网适配器设置自定义 ip 时无法绑定(bind)套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com