6

問題

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発生する問題は、セットアップが正しいにもかかわらず、この呼び出しが失敗することです。RTEMSのエラー125は次のEADDRNOTAVAILとおりです。

存在しないインターフェイスが要求されたか、要求されたアドレスがローカルではありませんでした。

明らかな原因

デバイスの起動時に、次の 2 つの方法のいずれかでネットワークをセットアップできます。

  1. ネットワーク IP と SUBNET は、デフォルトのブートローダー (UBOOT) にあるものに基づいて自動構成され、RTEMS OS を通じて設定されます。

  2. RTEMS 関数rtems_bsdnet_ifconfigは、起動後に唯一のイーサネット インターフェイスの IP アドレスを変更するために呼び出されます。

明確にするために、オプション 2 は次のように呼び出されます。

rtems_bsdnet_ifconfig(eth_interface, SIOCSIFADDR, &ipaddr);

ネットワークがオプション 1 で示されるように設定されている場合、すべてが期待どおりに機能しますが、オプション 2 が使用されている場合 (設定がオプション 1 で定義されたネットワーク オプションと一致する場合でも)、ソケット バインドは失敗します。

IP を再構成すると、このバインドが失敗することを示す RTEMS の既知の理由またはバグはありますか?

追加情報

  • 基本的に を使用する方法を使用して、新しい IP アドレス (オプション 2) を設定していますioctl("eht1", SIOCSIFADDR, ...)

  • ローカル ADDRESS を指定せずにソケットをバインドすると (つまり use INADDR_ANY)、どのような場合でも機能します。

  • rtems_bsdnet_ifconfig、関数の単純なインターフェイスですioctl。それはからのものrtems_glue.cであり、関数シグネチャを持っていますint rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)

  • このバインドを除いて、通常のネットワーク機能はすべて機能しているようです。

  • これを見た後、IPアドレスをリセットするためにもっと多くのことをする必要があるのではないかと思いました. しかし、これは機能しません。最初の回答を使用したり、何かを行ったりするとSIOCSIFFLAGS、すべてのネットワーク機能が停止します。

4

1 に答える 1

1

You didn't mention the architecture you are running on, but you are setting the port and address in local byte order, which may not be the same as network byte order. The very first thing I would try is:

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

This will also make your code more portable, in case that is NOT your problem (i.e. you are running on a big-endian host) and you one day try to compile on a different system that is little endian.

于 2016-07-11T17:37:25.687 に答える