关于用modem拨号的问题

昵称就这么定了 2008-06-05 09:56:57
public class RasManager
{
public const int RAS_MaxEntryName = 256;
public const int RAS_MaxPhoneNumber = 128;
public const int UNLEN = 256;
public const int PWLEN = 256;
public const int DNLEN = 15;
public const int MAX_PATH = 260;
public const int RAS_MaxDeviceType = 16;
public const int RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
static int rasLastConnection = 0;
const int INTERNET_RAS_INSTALLED = 0x10;
const int RAS_MaxDeviceName = 128;
public delegate void Callback(uint unMsg, int rasconnstate, int dwError);
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
public struct RASDIALPARAMS
{
public int dwSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxCallbackNumber + 1)]
public string szCallbackNumber;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN + 1)]
public string szUserName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = PWLEN + 1)]
public string szPassword;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = DNLEN + 1)]
public string szDomain;
public int dwSubEntry;
public int dwCallbackId;
}
[DllImport("rasapi32.dll", CharSet = CharSet.Auto)]
public static extern int RasDial(int lpRasDialExtensions, string lpszPhonebook, ref RASDIALPARAMS lprasdialparams, int dwNotifierType, Callback lpvNotifier, ref int lphRasConn);

private RASDIALPARAMS RasDialParams;
private int Connection;
[DllImport("WININET", CharSet = CharSet.Auto)]
public static extern bool InternetGetConnectedState(ref int lpdwFlags, int dwReserved);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int RasEnumConnections([In, Out] RASCONN[] lprasconn, ref int lpcb, ref int lpcConnections);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int RasGetConnectStatus(IntPtr hrasconn, ref RASCONNSTATUS lprasconnstatus);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int RasHangUp(IntPtr hrasconn);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASCONN
{
public int dwSize;
public IntPtr hrasconn;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szPhonebook;
public int dwSubEntry;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RASCONNSTATUS
{
public int dwSize;
public int rasconnstate;
public int dwError;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
}
public RasManager()
{
Connection = 0;
RasDialParams = new RASDIALPARAMS();
RasDialParams.dwSize = Marshal.SizeOf(RasDialParams);
}
public int Connect()
{
try
{
Callback rasDialFunc = new Callback(RasManager.RasDialFunc);
RasDialParams.szEntryName += "\0";
RasDialParams.szUserName += "\0";
RasDialParams.szPassword += "\0";
int result = RasDial(0, null, ref RasDialParams, 0, rasDialFunc, ref Connection);

if (result != 0)
{
if (rasLastConnection != 0)
{
IntPtr intptr = new IntPtr(rasLastConnection);
RasHangUp(intptr); //终止上一次操作
rasLastConnection = 0;

intptr = new IntPtr(Connection);//Connection 为本次拨号进程的句柄
RasHangUp(intptr); //终止本次操作
}
}

rasLastConnection = Connection;

if (rasLastConnection != 0)
{
if (File.Exists(@"c:\skyimail\dialhundle.txt"))
{
File.Delete(@"c:\skyimail\dialhundle.txt");

StreamWriter sw = new StreamWriter(@"c:\skyimail\dialhundle.txt");
sw.Write(rasLastConnection);
sw.Close();
}
else
{
StreamWriter sw = new StreamWriter(@"c:\skyimail\dialhundle.txt");
sw.Write(rasLastConnection);
sw.Close();
}
}

return result;

}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(e.ToString());
return 0;
}
}

public static void RasDialFunc(uint unMsg, int rasconnstate, int dwError)
{
if (rasconnstate == 8192)//8192表示已经拨通 {
//System.Windows.Forms.MessageBox.Show("拨号: "+rasconnstate.ToString());
}
}

public void HangAllConnection()
{
int flags = 0;
InternetGetConnectedState(ref flags, 0);
if (!((flags & INTERNET_RAS_INSTALLED) == INTERNET_RAS_INSTALLED))
throw new NotSupportedException();

//create array of structures to pass to API
int ret;
int conns = 0;
RASCONN[] rarr = new RASCONN[256];
rarr.Initialize();
rarr[0].dwSize = Marshal.SizeOf(typeof(RASCONN));
int lr = rarr[0].dwSize * rarr.Length;

//call RasEnumConnections to loop all RAS connections
ret = RasEnumConnections(rarr, ref lr, ref conns);
//if (ret != 0) throw new Win32Exception(ret);
//loop through each RASCONN struct
for (int i = 0; i < conns; i++)
{
//retrieve RASCONN struct
RASCONN r = rarr[i];

//if connection bad, handle will be 0
if (r.hrasconn == IntPtr.Zero) continue;
RasHangUp(r.hrasconn);
}
}
}
}
调用这个类进行拨号
RasManager ras = new RasManager();
ras.EntryName = this.txtDialupName.Text.Trim();
ras.UserName = this.txtDialupUser.Text.Trim();
ras.Password = this.txtDialupPwd.Text.Trim();
ras.Connect();

这个是拨号方法,问题是在拨号时老是说程序遇到问题就关闭了,没有什么提示

private void Hangup()
{
RasManager ras = new RasManager();
ras.HangAllConnection();
Thread.Sleep(2000);

}
关闭拨号的方法
...全文
285 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧