WINCE下的GPRS拨号连接,
一、拨号函数:RasDial(IntPtr dialExtensions, IntPtr phoneBookPath,IntPtr rasDialParam,uint NotifierType,IntPtr notifier,ref IntPtr pRasConn ) ,函数返回值类型为uint,成功返回0。
二、断开连接的函数:RasHangUp(IntPtr pRasConn),函数返回值类型为uint,成功返回0.
三、列举当前已经建立的活动的连接的函数:RasEnumConnections([In, Out] _RASCONN[] lprasconn, ref UInt32 lpcb, ref UInt32 lpcConnections),函数返回值类似为uint32,参数的结构体类型下文再说。
在wince5.0系统上调试成功,注意
1、 r = RasDial(IntPtr.Zero, IntPtr.Zero, (IntPtr)pAddr, 0, IntPtr.Zero, ref RasConn);函数返回0值,代表成功联网,但是必须拿掉USB才可以正常显示网页。也就是说,上午时不可以用USB与PC同步。
2、同样,如果先USB与PC同步后RasDial,发送数据到服务器也收不到。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Wince_CLR_RAS
{
public class CLR_RAS
{
#region 引用coredll
[DllImport("coredll.dll")]
private static extern uint RasDial
(
IntPtr dialExtensions,
IntPtr phoneBookPath,
IntPtr rasDialParam,
uint NotifierType,
IntPtr notifier,
ref IntPtr pRasConn
);
[DllImport("coredll.dll")]
private static extern uint RasHangUp(IntPtr pRasConn);
[DllImport("coredll.dll", CharSet = CharSet.Unicode)]
internal static extern UInt32 RasEnumConnections([In, Out] _RASCONN[] lprasconn, ref UInt32 lpcb, ref UInt32 lpcConnections);
const int RAS_MaxEntryName = 20;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct _RASCONN
{
private UInt32 m_size;
private IntPtr m_hrasconn;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RAS_MaxEntryName + 1)]
public char[] m_entryName;
public IntPtr ConnectionHandle { get { return m_hrasconn; } }
public string EntryName { get { return new string(m_entryName).TrimEnd(new char[] { '\0' }); } }
public static _RASCONN CreateStruct()
{
_RASCONN obj = new _RASCONN();
obj.m_size = System.Convert.ToUInt32(Marshal.SizeOf(typeof(_RASCONN)));
obj.m_hrasconn = IntPtr.Zero;
obj.m_entryName = new char[RAS_MaxEntryName + 1];
return obj;
}
}
#endregion
#region 列举已建立的活动连接
/// <summary>
/// 列举已建立的活动连接
/// </summary>
/// <returns></returns>
private static _RASCONN[] EnumerateConnections()
{
_RASCONN[] rasconn;
UInt32 size = 0, noelements = 0;
size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[1])[0] = _RASCONN.CreateStruct()));
if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00)
{
// size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[size / Marshal.SizeOf(typeof(_RASCONN))])[0] = _RASCONN.CreateStruct()) * rasconn.Length);
rasconn = new _RASCONN[size / Marshal.SizeOf(typeof(_RASCONN))];
rasconn[0] = _RASCONN.CreateStruct();
size = System.Convert.ToUInt32(Marshal.SizeOf(rasconn[0]) * rasconn.Length);
if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00) { rasconn = null; }
}
return rasconn;
}
#endregion
/// <summary>
/// GPRS拨号连接
/// </summary>
/// <param name="EntryName">拨号连接的名称</param>
/// <param name="UserName">用户名</param>
/// <param name="Password">密码</param>
/// <param name="RasConn">返回的句柄</param>
/// <returns></returns>
unsafe private static uint myRasDial(string EntryName, string UserName, string Password, out IntPtr RasConn)
{
/*
EntryName ,UserName,Password - same as in RASDIALPARAMS structure (see
MSDN)
*/
uint r = 0;
RasConn = IntPtr.Zero;
byte[] bRASDIALPARAMS = new byte[1464];
fixed (byte* pAddr = bRASDIALPARAMS)
{
byte* pCurrent = pAddr;
Marshal.WriteInt32((IntPtr)pCurrent, bRASDIALPARAMS.Length);
pCurrent += 4;
foreach (byte b in Encoding.Unicode.GetBytes(EntryName))
{
Marshal.WriteByte((IntPtr)pCurrent, b);
pCurrent++;
}
pCurrent = pAddr + 0x192;//0x192 - offset for RASDIALPARAMS.UserName
foreach (byte b in Encoding.Unicode.GetBytes(UserName))
{
Marshal.WriteByte((IntPtr)pCurrent, b);
pCurrent++;
}
pCurrent = pAddr + 0x394;//0x394 - offset for RASDIALPARAMS.Password
foreach (byte b in Encoding.Unicode.GetBytes(Password))
{
Marshal.WriteByte((IntPtr)pCurrent, b);
pCurrent++;
}
r = RasDial(IntPtr.Zero, IntPtr.Zero, (IntPtr)pAddr, 0, IntPtr.Zero, ref RasConn);
}
return r;
}
/// <summary>
/// 断开所有活动的连接
/// </summary>
public static void DicConnectAll()
{
_RASCONN[] ran = EnumerateConnections();
for (int i = 0; i < ran.Length; i++)
{
if (ran[i].EntryName =="GPRS")
{
RasHangUp(ran[i].ConnectionHandle);
}
}
}
/// <summary>
/// 所有活动的连接
/// </summary>
public static string ListConnectAll()
{
string strCon = "";
_RASCONN[] ran = EnumerateConnections();
for (int i = 0; i < ran.Length; i++)
{
strCon +=ran[i].EntryName+",";
}
return strCon;
}
/// <summary>
/// 断开已建立的连接
/// </summary>
/// <param name="mEntryName">已建立的活动连接的名称</param>
/// <returns></returns>
public static bool disConnect(string mEntryName)
{
_RASCONN[] ran = EnumerateConnections();
for (int i = 0; i < ran.Length; i++)
{
if (ran[i].EntryName == mEntryName)
{
if (RasHangUp(ran[i].ConnectionHandle) == 0)
return true;
else
return false;
}
}
return false; //表示没有此连接
}
/// <summary>
/// 判断是否已经建立连接
/// </summary>
/// <param name="mEntryName">要查询状态的拨号连接的名称</param>
/// <returns></returns>
public static bool GPRSIsCon(string mEntryName)
{
_RASCONN[] ran = EnumerateConnections();
for (int i = 0; i < ran.Length; i++)
{
if (ran[i].EntryName == mEntryName)
return true;
}
return false; //表示没有此连接
}
public static bool GPRSConnectNet(string mEntryName)
{
IntPtr hRaon;
uint res = myRasDial(mEntryName, "", "", out hRaon);
if (res == 0)
return true;
else
return false;
}
}
}