当前位置: 代码迷 >> Windows Mobile >> 透过WIFI连接SOCKET或TcpClient失败的现象
  详细解决方案

透过WIFI连接SOCKET或TcpClient失败的现象

热度:2379   发布时间:2013-02-26 00:00:00.0
通过WIFI连接SOCKET或TcpClient失败的现象
近期做一项目,包含一Server端,一PC Client,一WM Client, 两个客户端的主要部分都是C#写的,且网络连接部分完全一样的代码,现在他们的连接状况如下:
1.PC Client, 无论是在自己机上,还是放到别人机子上,通过WIFI访问自己机上的Server都完全正常,从自己机上的Client通过WIFI访问别机上的Server也完全正常。
2.WM Client, 在模拟器上访问Server完全正常, 在真机上连数据线访问本机Server也正常, 在真机上连本机数据线通过WIFI访问别机上的Server也正常。
3.就是当手机不连接数据线通过WIFI连接Server失败,TcpClient的Connect,Send测试包失败.
自我测试诊断:
网络环境为TPLink无线路由,完全局域网IP测试,服务器IP为192.168.1.20, 手机为192.168.1.100
用过两个手机测试(M8和Diamond2)都一样, 现以Diamond2为例说明,手机为一新机,无SIM卡(所以请不要拿GPRS说事), 仅开WIFI, 打开IE访问服务器上的 http://192.168.1.20/, 能出IIS7的首页,说明手机到Server的WIFI网络是通的,同时在Server上Ping 192.168.1.100,也完全正常没有掉包过,说明双向网络都是通的
通过在Server端的监听处理代码段中断点,发现客户端的连接根本没到达Server断那边(Server端原来是监听指定IP的,那时连数据线都不能访问Server,遂将监听IP改成了0,0,0,0,连数据线就能够连接Server了)
将Server机上的和路由器上的防火墙什么的全关了,都一样,因此不是防火墙的原因
我这机器是Win7系统,另一台机器是XP系统,用哪一台做Server都一样,因此不是操作系统的原因
TcpClient的创建,连接的代码都跟PC Client的一样的,且在模拟器或是用数据线都能连,因此这部分的代码是没问题的。
Google相关现象:
国内的论坛里有人问过这问题,但没有得到解决,很多人都是基于GPRS的,所以性质不同
国外的论坛也有人问过这问题,同样也没有解决,甚至其中包括有一个人说他用HD2出现这问题,但用一个老的叫 Oxxxxx II 的手机没问题(xxxxx几个字母我没记住)
Symbian开发的有人有此问题,结果是在MMP文件里加入NetworkService的能力就可以解决。
IPhone的开发也有人有类似问题,解决结果不清楚

后来我在SOCKET连接之前,加入了一些网上找来的代码,其中关键部分列如下:
ci.cbSize = (uint) Marshal.SizeOf(ci);
            ci.dwParams = CONNMGR_PARAM_GUIDDESTNET; 
            ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP|CONNMGR_FLAG_PROXY_WAP|CONNMGR_FLAG_PROXY_SOCKS4|CONNMGR_FLAG_PROXY_SOCKS5;
            ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
            ci.bExclusive = 0;
            ci.bDisabled =0; 
            ci.hWnd = IntPtr.Zero;
            ci.uMsg = 0;
            ci.lParam = 0;

            ci.guidDestNet = new Guid("{ 0xa1182988, 0x0d73, 0x439e, { 0x87, 0xad, 0x2a, 0x5b, 0x36, 0x9f, 0x80, 0x8b }}");

            if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, INFINITE, ref status) != S_OK && 
                status != CONNMGR_STATUS_CONNECTED)
                return false;
这部分代码对用GPRS访问的时候应该是很管用的,作用就是激活或建立网络连接吧(这个意思),我不清楚WIFI需不需要这功能,反正加入试了一下,利用这代码,在我正式的TcpClient之前访问下http://192.168.1.20,看看能不能起到激活选择WIFI网络方式的作用(我的WIFI连接一直都是手工事先连好的)
最开始,GUID那句没加,通过观察,似乎是能连上HTTP,但对我后面的连接没起作用,后来看到别人的代码里能过这个GUID
指定是WAP,NET,CORP, 前两个应该是对应GPRS的两种方式,CORP从字面上似乎是公司的意思,不知道是不是对应WM系统连接设置里的单位网络?试试吧,我同时对应的把系统连接设置里的两个全设成了单位网络,同时WIFI网卡设置页面也设成了只连接到单位网络,但加了这句GUID后,似乎TcpClient正式连接前的访问http都直接失败了。

谢谢各位能耐心的看这么长,我想应该把我前后的过程都讲完了,请大家帮助分析,以前有没有处理过这问题的经验。
我的理解,当手机有可用的WIFI连接,且已连接上的时候,应该是不用做什么动作,就可以直接进行TCP连接吧,看来这里面有问题,就是当想直接用WIFI连SOCKET之前,可能要进行什么处理,现在问题就是要先作什么处理呢??
------解决方案--------------------------------------------------------
每天回帖即可获得10分可用分!
------解决方案--------------------------------------------------------
上次也是你吧

在手机上用IE访问 http://ServerIP:ServerPort/  看看Server有动静不?
  相关解决方案