最近在进行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会变化???),以及这个函数的三个参数是什么意思?
Andy Yin1:
有没有可能是网口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}