为以太网适配器设置自定义IP时无法绑定套接字

Fan*_*Fox 6 c c++ sockets networking rtems

问题

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

// 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;
    ...
Run Code Online (Sandbox Code Playgroud)

这适用于UDP通信,除了下面解释的奇怪的特定场景.bind即使设置正确,我们遇到的问题是此调用失败.我们得到125RTEMS 的错误EADDRNOTAVAIL:

请求了一个不存在的接口,或者请求的地址不是本地的.

表观原因

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

  1. 网络IP和SUBNET基于默认引导加载程序(UBOOT)中的内容进行自动配置,并通过RTEMS OS进行设置.

  2. rtems_bsdnet_ifconfig调用RTEMS函数以在引导时间后更改唯一以太网接口的IP地址.

为了澄清,选项2的调用方式如下:

rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
Run Code Online (Sandbox Code Playgroud)

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

RTEMS是否存在已知原因或错误,表明如果重新配置IP,此绑定将失败?

附加信息

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

  • 如果我们绑定我们的套接字而不指定本地ADDRESS(即使用INADDR_ANY)那么它在任何情况下都可以工作.

  • rtems_bsdnet_ifconfig是一个简单的ioctl功能接口.它来自rtems_glue.c并具有功能标志int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)

  • 除了这个绑定外,所有正常的网络功能似乎都有效.

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

Kea*_*ean 1

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

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

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