问题
在我们运行 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;
...
这适用于 UDP 通信,除非在下面解释的奇怪的特定场景中。bind
即使设置正确,我们遇到的问题是此调用失败。我们得到125
RTEMS 的错误是EADDRNOTAVAIL
:
请求的接口不存在或请求的地址不是本地的。
明显的原因
在设备启动时,我们可以通过以下两种方式之一来设置我们的网络:
网络 IP 和子网是根据默认引导加载程序 (UBOOT) 中的内容自动配置的,并通过 RTEMS 操作系统进行设置。
启动时间后调用RTEMS 函数
rtems_bsdnet_ifconfig
来更改唯一以太网接口的 IP 地址。
为了澄清起见,选项 2 的调用如下:
rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
如果按照选项 1 的指示设置网络,则一切都按预期工作,但如果使用选项 2(即使设置与选项 1 定义的网络选项匹配),则套接字绑定将失败。
RTEMS 是否存在已知原因或错误,表明如果您重新配置 IP,此绑定将失败?
附加信息
我们正在使用一种基本上使用
ioctl("eht1", SIOCSIFADDR, ...)
.如果我们绑定我们的套接字而不指定本地地址(即使用
INADDR_ANY
),那么它在任何情况下都有效。rtems_bsdnet_ifconfig
是函数的简单接口ioctl
。它来自rtems_glue.c
并具有功能签名int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
除了这个绑定之外,所有正常的网络功能似乎都可以工作。
看了这个之后,我想也许我需要做更多的事情来重置我的 IP 地址。但这不起作用,使用第一个答案甚至做任何事情
SIOCSIFFLAGS
都会导致所有网络功能停止。