这个是前一段时间做的东西今天想起来还是写的篇博客,算是个总结也便于自己今后查找,WinCE的自身的拨号存在一个问题就是在LAN口同时有效的情况下虽然拨通了,但是OS的路由表不对,所以在3G模块和LAN口需要同时工作情况下,就需要在拨号成功后来修改路由表,将3G的跳数设置为最优这样数据才能通过路由表决策到通过3G到外网,网上针对这个问题是通过一个基于C#的lib来是实现,本文通过利用Win32相应API来是实现,当时测试通过的是CE6.0 硬件平台为三星6410
- void K3GCall::SetRoute()
- {
- /*
- 针对OS拨号的bug
- 修改相应的路由实现LAN口和3G拨号模块的共存工作
- */
- ULONG size=0;
- DWORD err,MinMetric=~0/*最小的跳数 OS进行网络通讯中断选择*/;
- err=GetAdaptersInfo(NULL,&size);
- char IP[16];
- int Index;
- if(err==ERROR_NO_DATA)
- {
- TRACE(_T("Error Set Route:err==ERROR_NO_DATA/n"));
- return ;
- }
- if(err!=ERROR_BUFFER_OVERFLOW)
- {
- TRACE(_T("Erro SetRoute :err==ERROR_BUFFER_OVERFLOW/n"));
- return;
- }
- PIP_ADAPTER_INFO AdapTab=(PIP_ADAPTER_INFO)malloc(size);//接口列表
- err=GetAdaptersInfo(AdapTab,&size);
- if(err!=NO_ERROR)
- {
- free(AdapTab);
- AdapTab=NULL;
- TRACE(_T("GetAdaptersInfo Error/n"));
- return;
- }
- TRACE(_T("Look Up All Adapter/n"));
- while(AdapTab!=NULL)
- {
- if(strstr(AdapTab->AdapterName,"3G WIRELESS"))
- {
- TRACE(_T("Got it/n"));
- strcpy(IP,AdapTab->IpAddressList.IpAddress.String);
- Index=AdapTab->Index;
- break;
- }
- AdapTab=AdapTab->Next;
- }
- if(AdapTab==NULL)
- {
- TRACE(_T("Did't Got it/n"));
- return;
- }
- TRACE(_T("Gate Way/n"));
- PMIB_IPFORWARDTABLE pFrwTab;
- size=0;
- err = GetIpForwardTable (NULL, &size, TRUE);
- if(err != ERROR_INSUFFICIENT_BUFFER)
- {
- TRACE(_T("err != ERROR_INSUFFICIENT_BUFFER/n"));
- return ;
- }
- pFrwTab = (PMIB_IPFORWARDTABLE)malloc(size);
- if(GetIpForwardTable(pFrwTab, &size, TRUE) != NO_ERROR)
- {
- free(pFrwTab);
- pFrwTab = NULL;
- TRACE(_T("GetIPForward Error/n"));
- return ;
- }
- int gotit=0;
- in_addr addr;
- MIB_IPFORWARDROW router;
- int i;
- for(i=0;i<pFrwTab->dwNumEntries;i++)
- {
- if(pFrwTab->table[i].dwForwardDest==0)
- {
- if(pFrwTab->table[i].dwForwardMetric1<MinMetric)
- {
- MinMetric=pFrwTab->table[i].dwForwardMetric1;
- }
- if(pFrwTab->table[i].dwForwardNextHop==inet_addr(IP))
- {
- gotit=1;
- memcpy(&router,&pFrwTab->table[i],sizeof(router));
- TRACE(_T("Got it /n"));
- }
- }
- }
- if(gotit==0)
- {
- TRACE(_T("Did't Got Route /n"));
- TRACE(_T("Make Entry/n"));
- memset(&router, 0, sizeof(MIB_IPFORWARDROW));
- router.dwForwardDest = 0;
- router.dwForwardMask = 0;
- router.dwForwardPolicy = 0;
- router.dwForwardType = 4; /* the next hop is not the final dest */
- router.dwForwardProto = 3; /* PROTO_IP_NETMGMT */
- router.dwForwardAge = 0;
- router.dwForwardNextHopAS = 0;
- router.dwForwardMetric1 = MinMetric;
- router.dwForwardMetric2 = ~0;
- router.dwForwardMetric3 = ~0;
- router.dwForwardMetric4 = ~0;
- router.dwForwardMetric5 = ~0;
- router.dwForwardNextHop=inet_addr(IP);
- router.dwForwardIfIndex=Index;
- }
- else
- {
- if((err=DeleteIpForwardEntry(&router))==NO_ERROR)
- {
- TRACE(_T("Delete Sucess/n"));
- }
- else
- {
- TRACE(_T("Delete Error/n"));
- }
- }
- TRACE(_T("Set Route/n"));
- if(MinMetric>0)
- {
- MinMetric--;
- }
- router.dwForwardMetric1=MinMetric;
- if((err=CreateIpForwardEntry(&router))==NO_ERROR)
- {
- TRACE(_T("Create Sucess/n"));
- }
- else
- {
- TRACE(_T("Create Error/n"));
- }
- }
在这里面因为是针对3G拨号中形成的连接的名称为3G WIRELESS 所以在这个里面通过查看3G拨号分配的IP, 然后再在OS的路由信息中找到相应的路由项,来修改相应的路由的跳数。