This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于NDK网络开发的疑问



最近在进行NDK的网络开发,其中遇到了一个问题比较疑惑:

rc = NC_NetStart( hcfg, NetworkOpen, NetworkClose, NetworkIPAddr );

这个函数中注册了3个函数,NetworkIPAddr函数我看NDK的说明文档里面说当IP地址变化的时候回调用它,那我的疑问是什么时候IP地址会变化呢?

如果说刚刚启动的时候,系统进行IP配置后调用它,我可以理解。但是当系统完全启动,网络已经正常工作后,什么情况下IP还会变动呢?

之所以提到这个问题是因为,最近开发的过程中,遇到了这样的问题。

我们的工程是这样的思路,用两个核,一个核专门用于接收网络数据,从PC端,放入公共内存,另一个核负责处理收到的数据,两个核用IPC通信,在实际应用中,我发现,网络核在接收到PC端的一部分数据后,突然就调用了NetworkIPAddr这个函数,这样导致打乱了整个系统的工作。

而这个NetworkIPAddr函数打印出来的信息是:

Network Removed: If-l:192.168.2.100

意思就应该是网络移除什么的。NetworkIPAddr这个函数我是直接copy的MCSDK ndk的 client例程的。

所以,请大神指点一下,NetworkIPAddr这个函数在什么情况下会调用(我知道IP变化的时候调用,可是什么情况下IP会变化???),以及这个函数的三个参数是什么意思?

  • 有没有可能是网口link down了,你看一下此时网口的状态。这个函数的三个参数如下所示,依次是IP地址,使用DHCP index,及添加or移除IP地址的标示。

    static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
    {
    static uint fAddGroups = 0;
    IPN IPTmp;

    if( fAdd )
    platform_write("Network Added: ");
    else
    platform_write("Network Removed: ");

    // Print a message
    IPTmp = ntohl( IPAddr );
    platform_write("If-%d:%d.%d.%d.%d\n", IfIdx,
    (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF,
    (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );

    // This is a good time to join any multicast group we require
    if( fAdd && !fAddGroups )
    {
    fAddGroups = 1;
    // IGMPJoinHostGroup( inet_addr("224.1.2.3"), IfIdx );
    }

    /* Create a Task to send/receive Raw ethernet traffic */
    #ifdef TEST_RAW_SEND
    hSendRaw = TaskCreate( SendRawEth, "TxRawEthTsk", OS_TASKPRINORM, 0x1400, 0, 0, 0 );
    #endif
    #ifdef TEST_RAW_RECV
    hRecvRaw = TaskCreate( RecvRawEth, "PerformRawRX", OS_TASKPRIHIGH, 0x1400, 0, 0, 0 );
    #endif
    }