首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

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

2013-01-11 
通过WIFI连接SOCKET或TcpClient失败的现象近期做一项目,包含一Server端,一PC Client,一WM Client, 两个客

通过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有动静不?



“打开IE访问服务器上的 http://192.168.1.20/, 能出IIS7的首页”,注意要刷新,不然看到的可能是缓存内容
[解决办法]
手工刷新一下
[解决办法]
wifi链接上IE能上网不
[解决办法]
连接上IE试一下能不能成功。
[解决办法]
我的项目和你差不多,用wifi连,确定wifi是通的。
插数据线或者不插,TCP确定是可用的。
插数据线,UDP不可用,可能UDP走数据线过不了。不插,UDP正常,走wifi过的。
[解决办法]
问题我也遇到了,但是还没有着手结局,插上数据线走的不是wifi网络,所以这个测试真正有效地部分是拔掉数据线直接走wifi的网络连接服务器。
[解决办法]


#include "Winsock2.h"
#pragma comment(lib, "ws2.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData ) != 0)
{
return 1;
}

SOCKET sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sck == INVALID_SOCKET)
{
goto errorOut;
}

sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");//server IP-----------------------
serverAddr.sin_port = htons(1122);//serverPort----------------------
if(serverAddr.sin_addr.s_addr == INADDR_NONE)
{
goto errorOut;
}

if(connect(sck, (sockaddr*)&serverAddr, sizeof(sockaddr_in))
== SOCKET_ERROR)
{
goto errorOut;
}

if(send(sck, "abcd1234", 8, 0) == SOCKET_ERROR)
{
goto errorOut;
}

char buf[16];
int iReadCurLen = recv(sck, buf, sizeof(buf), NULL);
if(iReadCurLen <= 0)
{
goto errorOut;
}

return 0;

errorOut:
if(sck != INVALID_SOCKET)
{
shutdown(sck, SD_BOTH);
closesocket(sck);
}
WSACleanup();
return 2;
}


上面是C++的,还不行,那就没招了

热点排行