WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络

来源:互联网 发布:硬件和软件 哪个 编辑:程序博客网 时间:2024/04/29 23:14

WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络

分类: Wince 263人阅读 评论(0) 收藏 举报

这个是前一段时间做的东西今天想起来还是写的篇博客,算是个总结也便于自己今后查找,WinCE的自身的拨号存在一个问题就是在LAN口同时有效的情况下虽然拨通了,但是OS的路由表不对,所以在3G模块和LAN口需要同时工作情况下,就需要在拨号成功后来修改路由表,将3G的跳数设置为最优这样数据才能通过路由表决策到通过3G到外网,网上针对这个问题是通过一个基于C#的lib来是实现,本文通过利用Win32相应API来是实现,当时测试通过的是CE6.0 硬件平台为三星6410

[cpp] view plaincopy
  1. void K3GCall::SetRoute()  
  2. {  
  3.     /* 
  4.     针对OS拨号的bug 
  5.     修改相应的路由实现LAN口和3G拨号模块的共存工作 
  6.     */  
  7.     ULONG size=0;  
  8.     DWORD err,MinMetric=~0/*最小的跳数 OS进行网络通讯中断选择*/;  
  9.     err=GetAdaptersInfo(NULL,&size);  
  10.     char IP[16];  
  11.     int Index;  
  12.     if(err==ERROR_NO_DATA)  
  13.     {  
  14.         TRACE(_T("Error Set Route:err==ERROR_NO_DATA/n"));  
  15.         return ;  
  16.     }  
  17.     if(err!=ERROR_BUFFER_OVERFLOW)  
  18.     {  
  19.         TRACE(_T("Erro SetRoute :err==ERROR_BUFFER_OVERFLOW/n"));  
  20.         return;  
  21.     }  
  22.     PIP_ADAPTER_INFO AdapTab=(PIP_ADAPTER_INFO)malloc(size);//接口列表  
  23.     err=GetAdaptersInfo(AdapTab,&size);  
  24.     if(err!=NO_ERROR)  
  25.     {  
  26.         free(AdapTab);  
  27.         AdapTab=NULL;  
  28.         TRACE(_T("GetAdaptersInfo Error/n"));  
  29.         return;  
  30.     }  
  31.     TRACE(_T("Look Up All Adapter/n"));  
  32.     while(AdapTab!=NULL)  
  33.     {  
  34.         if(strstr(AdapTab->AdapterName,"3G WIRELESS"))  
  35.         {  
  36.             TRACE(_T("Got it/n"));  
  37.             strcpy(IP,AdapTab->IpAddressList.IpAddress.String);  
  38.             Index=AdapTab->Index;  
  39.             break;  
  40.         }  
  41.         AdapTab=AdapTab->Next;  
  42.     }  
  43.     if(AdapTab==NULL)  
  44.     {  
  45.         TRACE(_T("Did't Got it/n"));  
  46.         return;  
  47.     }  
  48.     TRACE(_T("Gate Way/n"));  
  49.     PMIB_IPFORWARDTABLE pFrwTab;  
  50.     size=0;  
  51.     err = GetIpForwardTable (NULL, &size, TRUE);  
  52.     if(err != ERROR_INSUFFICIENT_BUFFER)  
  53.     {  
  54.         TRACE(_T("err != ERROR_INSUFFICIENT_BUFFER/n"));  
  55.         return ;  
  56.     }  
  57.     pFrwTab = (PMIB_IPFORWARDTABLE)malloc(size);  
  58.     if(GetIpForwardTable(pFrwTab, &size, TRUE) != NO_ERROR)  
  59.     {  
  60.         free(pFrwTab);  
  61.         pFrwTab = NULL;  
  62.         TRACE(_T("GetIPForward Error/n"));  
  63.         return ;  
  64.     }  
  65.     int gotit=0;  
  66.     in_addr addr;  
  67.     MIB_IPFORWARDROW router;  
  68.     int i;  
  69.     for(i=0;i<pFrwTab->dwNumEntries;i++)  
  70.     {  
  71.         if(pFrwTab->table[i].dwForwardDest==0)  
  72.         {  
  73.             if(pFrwTab->table[i].dwForwardMetric1<MinMetric)  
  74.             {  
  75.                 MinMetric=pFrwTab->table[i].dwForwardMetric1;  
  76.             }  
  77.             if(pFrwTab->table[i].dwForwardNextHop==inet_addr(IP))  
  78.             {  
  79.                 gotit=1;  
  80.                 memcpy(&router,&pFrwTab->table[i],sizeof(router));  
  81.                 TRACE(_T("Got it /n"));  
  82.             }  
  83.         }  
  84.     }  
  85.     if(gotit==0)  
  86.     {  
  87.         TRACE(_T("Did't Got Route /n"));  
  88.         TRACE(_T("Make Entry/n"));  
  89.         memset(&router, 0, sizeof(MIB_IPFORWARDROW));  
  90.         router.dwForwardDest = 0;  
  91.         router.dwForwardMask = 0;  
  92.         router.dwForwardPolicy = 0;  
  93.         router.dwForwardType = 4;  /* the next hop is not the final dest */  
  94.         router.dwForwardProto = 3; /* PROTO_IP_NETMGMT */  
  95.         router.dwForwardAge = 0;  
  96.         router.dwForwardNextHopAS = 0;  
  97.         router.dwForwardMetric1 = MinMetric;  
  98.         router.dwForwardMetric2 = ~0;  
  99.         router.dwForwardMetric3 = ~0;  
  100.         router.dwForwardMetric4 = ~0;  
  101.         router.dwForwardMetric5 = ~0;  
  102.         router.dwForwardNextHop=inet_addr(IP);  
  103.         router.dwForwardIfIndex=Index;  
  104.     }  
  105.     else  
  106.     {  
  107.         if((err=DeleteIpForwardEntry(&router))==NO_ERROR)  
  108.         {  
  109.             TRACE(_T("Delete Sucess/n"));  
  110.         }  
  111.         else  
  112.         {  
  113.             TRACE(_T("Delete Error/n"));  
  114.         }  
  115.     }  
  116.     TRACE(_T("Set Route/n"));  
  117.     if(MinMetric>0)  
  118.     {  
  119.         MinMetric--;  
  120.     }  
  121.     router.dwForwardMetric1=MinMetric;  
  122.     if((err=CreateIpForwardEntry(&router))==NO_ERROR)  
  123.     {  
  124.         TRACE(_T("Create Sucess/n"));  
  125.     }  
  126.     else  
  127.     {  
  128.         TRACE(_T("Create Error/n"));  
  129.     }  
  130. }  
 

在这里面因为是针对3G拨号中形成的连接的名称为3G WIRELESS 所以在这个里面通过查看3G拨号分配的IP, 然后再在OS的路由信息中找到相应的路由项,来修改相应的路由的跳数。

原创粉丝点击