WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络
来源:互联网 发布:硬件和软件 哪个 编辑:程序博客网 时间:2024/04/29 23:14
WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络
分类: Wince2010-11-16 11:49 263人阅读 评论(0) 收藏 举报
这个是前一段时间做的东西今天想起来还是写的篇博客,算是个总结也便于自己今后查找,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的路由信息中找到相应的路由项,来修改相应的路由的跳数。
- WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络
- 3G模块在wince下的自动拨号
- 3G拨号
- 3G拨号
- 3G拨号
- WinCE下的3G拨号助手
- WinCE下的3G拨号助手
- ubuntu下插上网线但是无法使用有线网络的解决办法
- 3G模块PPPD拨号流程分析
- 3G模块PPPD拨号流程分析
- 3G模块PPPD拨号流程分析
- Linux下ppp拨号+电信3G模块
- YUGA CWM900 3G模块拨号脚本
- WinCE下3G模块的调试
- WinCE下3G模块的调试
- Android 网络连接--Wifi/3G
- Android 网络连接--Wifi/3G
- 检查3G网络是否连接
- poj 2632 Crashing Robots
- Android 资源文件夹下的文件不能有大写字符,会导致R.java无法生成
- C#调用C++写的dll,包含结构体转换和C#动态调用dll(头文件转换为类)
- ofbiz实现oracle平台小例子详解步骤及注意的问题
- SQL注入全接触
- WinCE 插上网线后3G拨号 拨上号但是无法通过3G模块连接网络
- zju 1013 dp
- Ofbiz10.04改用mysql数据库配置
- 【Qt开发】Qt中的中文字符问题
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用)
- poj 1950
- Win7安装VS2008 SP1卡在 VS90sp1-KB945140-X86-CHS 的解决方法
- C#中调用C++写的DLL注意事项
- asp.net sitemappath站点地图