typedef struct _CONNMGR_CONNECTIONINFO
{
DWORD cbSize; // @field Size of this structure
DWORD dwParams; // @field Valid parms, set of CONNMGR_PARAM_*
DWORD dwFlags; // @field Connection flags, set of CONNMGR_FLAG_*
DWORD dwPriority; // @field Priority, one of CONNMGR_PRIORITY_*
BOOL bExclusive; // @field Connection is exclusive, see comments
BOOL bDisabled; // @field Don't actually connect
GUID guidDestNet; // @field GUID of network to connect to
HWND hWnd; // @field hWnd to post status change messages to
UINT uMsg; // @field Msg to use when posting status changes
LPARAM lParam; // @field lParam to use when posting status changes
ULONG ulMaxCost; // @field Max acceptable cost of connection
ULONG ulMinRcvBw; // @field Min acceptable receive bandwidth of connection
ULONG ulMaxConnLatency; // @field Max acceptable connect latency
} CONNMGR_CONNECTIONINFO;
里面的bExclusive需要为TRUE
默认FALSE 是共享网络连接,设置为true后则为不共享,这样调用release时就会关闭连接了。
建立一个连接,不与其他应用共享就可以了.在应用退出时,会自动断开连接.
sConInfo.bExclusive = TRUE;
该默认值是FALSE,与其他连接共享一个线路.所以建立之后.应用退出.gprs不会断开.
把这个标志改为TRUE就可以了.
连接管理器是有自己的连接、断开策略的,使用连接管理器函数建立连接或断开连接并不一定就立刻生效,是否成功要看当前连接管理器的状态和其逻辑判断,微软 的文档上有一些介绍,可以参考,需要做大量试验来证明这些策略
对上面的问题,手动禁止掉比如cmnet连接,实际上注册表中有一项来表示某个APN是否是disable的,对disable掉的连接连接管理器是不会考虑连接使用的。
微软默认有四个meta-network,对应了四个GUID,默认使用internet那个,也可以自己增加新的meta-network,定义自己的连接规则和GUID,使用这个GUID就可以定制建立什么连接了。
所 以说ConnMgrReleaseConnection函数是有作用的,但是不一定会立刻生效。比如你建立了连接,获得连接句柄,调用 ConnMgrReleaseConnection断开时没有其他应用在使用该连接,这时由该函数的参数来决定是否断开及断开的时间是多少。
在无任何应用使用连接的情况下,默认会使用注册表中的一个键值来决定连接保持时间。
如果ConnMgrReleaseConnection参数是0会立刻断开
如果是>1的一个数字表示断开需要的时间,具体察看SDK等相关文档
使用RAS相关函数断开是可以的,但是因为RAS会绕开连接管理器,所以微软不建议使用该函数,这样可能会影响到连接管理器的内部逻辑,造成状态混乱影响使用。
RAS断开的方法,枚举所有连接,然后一一断开,我试验过,完全可以,现在做程序时也一直作为保留的压箱底方法,因为连接管理器的函数不一定会立刻生效。
此外,断开连接的方法还可以是,停止创建连接的进程或线程。如果知道创建连接的是哪个线程,杀掉他,GPRS连接也会立刻断开。