在我们运行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和SUBNET根据默认引导加载程序(UBOOT)中的内容进行自动配置,并通过RTEMS OS进行设置。
调用RTEMS函数rtems_bsdnet_ifconfig
以在引导时间后更改唯一以太网接口的IP地址。
为了澄清,选项2的调用如下:
rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);
如果按照选项1的说明设置了网络,则一切都按预期工作,但如果使用选项2(即使在设置与选项1定义的网络选项匹配的情况下),则套接字绑定也会失败。
RTEMS是否存在已知原因或错误,表明如果重新配置IP,此绑定会失败?
我们正在使用一种基本上使用ioctl("eht1", SIOCSIFADDR, ...)
的方法设置新的IP地址(选项2)。
如果我们绑定我们的套接字而没有指定本地ADDRESS(即使用INADDR_ANY
),那么它在任何情况下都有效。
rtems_bsdnet_ifconfig
是ioctl
函数的简单接口。它来自rtems_glue.c
,并具有函数签名int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
除了此绑定外,所有正常的网络功能似乎都有效。
看了this之后,我想我可能需要在重置IP地址方面做得更多。但这不起作用,使用第一个答案甚至对SIOCSIFFLAGS
执行任何操作都会导致所有网络功能停止。
答案 0 :(得分:1)
您没有提到正在运行的体系结构,但是您以本地字节顺序设置端口和地址,这可能与网络字节顺序不同。我要尝试的第一件事是:
localSocketAddress.sin_port = htons (localPort);
localSocketAddress.sin_addr.s_addr = htonl (localAddress);
这也将使您的代码更具可移植性,以防这不是您的问题(即您在大端主机上运行),并且您有一天尝试在不同的端系统上编译。