此模块分两部分完成,传输数据用socket ,要使用socket在ppc上进行数据传输,就要谁让ppc自动连接gprs 。其中套接字和gprs链接分别进行说明。
一 ,应用程序在进行其它所需的Windows Sockets API调用需要进行一次成功的WSAStartup()调用,然后就是套接字编程。分为服务器端和客户端。
服务器:
先建立套接字
SOCKET WSASocket(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags
);//具体参数参见设置MSDN
然后初始化一个SOCKADDR_IN结构体,然后用bind()将本地ip与端口与socket进行绑定,之后用listen()监听该套接字,如果有连接请求则使用accept()建立连接,然后用send()和recv()接受和发送数据,最后关闭套接字。
客户端:
客户端与服务器端不同的是不需要进行socket绑定,不需要监听是否有连接请求,也不用accept()建立连接,而是用connect()发起连接请求。
进行调试时必须先运行服务器端,再运行客户端。
二,首先我们利用ConnMgrApiReadyEvent()函数来确认是否有可用连接,利用此函数来我们可以返回一个连接事件的句柄 ,注意在的得到句柄后要记得及时释放,
然后用WaitForSingleObject()函数的返回值可以判断在指定时间内是否找到可用连接,如果返回值WAIT_OBJECT_0说明有可用连接,然后通过ConnMgrMapURL ()函数来选则一个最好的链接,函数原型为:
HRESULT WINAPI ConnMgrMapURL(
LPCTSTR pwszURL,
GUID * pguid,
DWORD * pdwIndex
);
ConnMgrMapURL()是通过给定的pwszURL地址,让系统自己选择一条最适合的网络连接来访问该URL,如果手机可以通过GPRS/Activesync/Wifi/3G等多种方式访问某个网络资源,用这个API你就不用担心到底该用什么方式联网,系统会自己给你选一条最适合的网络连接。第二个参数GUID * pguid是根据第一个参数pwszURL进行赋值,即你访问的URL是http还是wap,每种都有一个全局唯一标识。然后通过ConnMgrEstablishConnectionSync()进行连接,此函数要传递一个CONNMGR_CONNECTIONINFO结构体,用于保存客户端的连接信息。然后就可以进行socket通信了,就是第一部分所说的。最后用ConnMgrReleaseConnection()释放连接。
提示:cmwap所获得的地址是经过分组的,我抓几次包都是10开头的ip,输入内网,外网的服务器找不到这样的ip,cmwap是未分组的,抓包显示的就是公网ip.
PS:较久以前做的关于windows mobile的项目