Probleme de Connection RAS

Résolu
cs_rebelmind Messages postés 6 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 4 août 2005 - 1 août 2005 à 13:20
 cudenetf - 13 févr. 2009 à 16:56
Bonjour tout le monde.

J'essaye depuis plusieurs jours d'implementer dans un prog C# l'utilisation des connexions modem!
en vain... je voudrais simplement à partir d'un numero de telephone FAI et d'un login et mot de passe
me connecter

j'ai essayer d'utiliser l'API rasapi32.dll :


[
DllImport(
"rasapi32.dll")]



public
extern
static
long RasDial(
long lpRasDialExtensions,
string lpszPhonebook,
RasDialParams lpRasDialParams,
long dwNotifierType,
object lpvNotifier,
long lphRasConn);



public
struct
RasDialParams
{

public
int dwSize;

public
string szEntryName;

public
string szPhoneNumber;

public
string szCallbackNumber;

public
string szUserName;

public
string szPassword;

public
string szDomain;

}



public
long Dial(
string Connection,
string Username,
string Password)
{

RasDialParams RDP =
new
RasDialParams();

long Resp;
RDP.dwSize =
Marshal.SizeOf(
typeof(
RasDialParams));
RDP.szEntryName = Connection
;

RDP.szPhoneNumber =
"0860880880";

RDP.szCallbackNumber =
"";

RDP.szUserName = Username;

RDP.szPassword = Password;

RDP.szDomain =
"";


Resp = RasDial(0,
null, RDP, 0L, 0, 0);



return Resp;


}

rien ne fonctionne!
la variable Resp != 0 et je n'arrive pas à traduire l'erreur renvoyée.

Merci d'avance pour votre aide.

30 réponses

cs_rebelmind Messages postés 6 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 4 août 2005
2 août 2005 à 12:40
Voila j'ai trouvé :)
merci à tous pour votre aide.
je me lance dans la deconnection... puis la gestion des VPN :)


Voici ma classe:


using System;

using System.Text;

using System.Runtime.InteropServices;



public
class
RasConnect
{

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;

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
uint RasDial(
int lpRasDialExtensions,
string lpszPhonebook,
ref
RASDIALPARAMS lprasdialparams,
int dwNotifierType,
Callback lpvNotifier,
ref
int lphRasConn);


[
DllImport(
"rasapi32.dll", CharSet =
CharSet.Auto)]

public
extern
static
uint RasGetErrorString(
uint uErrorValue,

StringBuilder lpszErrorString,
[
In]
int cBufSize
);



private
RASDIALPARAMS RasDialParams;

private
int Connection;



public RasConnect()
{
Connection = 0;
RasDialParams =
new
RASDIALPARAMS();
RasDialParams.dwSize =
Marshal.SizeOf(RasDialParams);
RasDialParams.szCallbackNumber =
null;
RasDialParams.szDomain =
null;
RasDialParams.szEntryName =
null;
}


#region Properties



public
string UserName
{

get{
return RasDialParams.szUserName;}

set{RasDialParams.szUserName =
value;}
}



public
string Password
{

get{
return RasDialParams.szPassword;}

set{RasDialParams.szPassword =
value;}
}



public
string PhoneNumber
{

get{
return RasDialParams.szPhoneNumber;}

set{RasDialParams.szPhoneNumber =
value;}
}


#endregion



public
string ConnectMessage(
uint errorCode)
{

string ret =
"";

if (errorCode == 0)
ret =
"Connexion etablie.";

else
{

try{

StringBuilder sb =
new
StringBuilder(512);

if (RasGetErrorString(errorCode, sb, sb.Capacity) > 0)

throw
new
Exception(
"Unknow RAS exception.");
ret = sb.ToString();
}

catch (
Exception e){
ret =
string.Format(
"ErrorCode:{0},{1}", errorCode, e.Message);
}
}

return ret;
}



public
uint Connect()
{

Callback rasDialFunc =
new
Callback(
RasConnect.RasDialFunc);
RasDialParams.szPhoneNumber +=
"\0";
RasDialParams.szUserName +=
"\0";
RasDialParams.szPassword +=
"\0";

uint result = RasDial(0,
null,
ref RasDialParams, 0,
null,
ref Connection);

return result;
}



public
static
void RasDialFunc(
uint unMsg,
int rasconnstate,
int dwError){}


}}

et pour l'instancier :


RasConnect RC =
new
RasConnect();
RC.PhoneNumber =
"num-de-tel";
RC.UserName =
"login";
RC.Password =
"mot-de-passe";

MessageBox.Show(RC.ConnectMessage(RC.Connect()));



et elle gere meme les messages d'erreurs
a la prochaine...
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 13:49
Salut, pour passer une structure null il faut utiliser IntPtr.Zero et pour simuler un pointeur sur une stucture c'est ref myStruct.
0
cs_rebelmind Messages postés 6 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 4 août 2005
1 août 2005 à 14:02
Merci pour la rapidité de reponse.
je debute sous DOT NET

tu pourrais illustrer ta solution

merci beaucoup
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 15:19
Tu dois aussi marshaler les chaines de ta structure, pour utiliser une fonction non managée il faut bien comprendre PInvoke sinon tu t'exposes à des problèmes, voir des pertes de mémoire, si tu es débutant en C# c'est pas vraiment une bonne idée de commencer par ca : )

http://pinvoke.net/default.aspx/rasapi32.RasDial

Il y'a peut être une API managée qui fait la même chose !?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rebelmind Messages postés 6 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 4 août 2005
1 août 2005 à 15:52
Je n'ai pas le choix, ce projet repond a un besoin de ma societe.
je l'ai proposé en C# pour me former à ce langage!

le but est de stocker les infos des connections clients dans un fichier, les appeller quand on veut les utiliser, realiser une connection RAS classique (tel, login, mdp) et venir modifier la table de routage une fois connecté pour dissocier la connection Modem (VPN) et l'ADSL (pour internet).

j'essaye la solution proposée :
http://pinvoke.net/default.aspx/rasapi32.RasDial
et te dit quoi...

merci encore
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 août 2005 à 16:10
Cool le site http://pinvoke.net/, ça vaut la peine de le mettre dans les favorites !
Merci

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 16:23
Bidou, j'ai dit la même chose la première fois que je suis tombé dessus ! : )

RebelMind, vi mais c'est quand même dommage de bosser sur un projet en .NET et d'utiliser pratiquement que des fonctions non managées, tu perds le bénéfice du code managé, bon courage, si y'a un truc que tu ne comprends pas avec PInvoke, on est là..
0
cs_rebelmind Messages postés 6 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 4 août 2005
1 août 2005 à 16:49
je sais, mais c'est une facon de se familiariser avec le code C# :)
et je pense bien realiser d'autres projets dans le futur...

pour en revenir a mon projet present, voici ma class RAS.cs :


using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Runtime.InteropServices;

using System.Drawing;

using System.Windows.Forms;


namespace ConnClientsV2
{

public
class
RAS
{


[
DllImport(
"rasapi32.dll", CharSet =
CharSet.Auto)]

static
extern
uint RasDial([
In]
RASDIALEXTENSIONS lpRasDialExtensions, [
In]
string lpszPhonebook, [
In]
RASDIALPARAMS lpRasDialParams,
uint dwNotifierType,
Delegate lpvNotifier,
uint lphRasConn);



public
enum
RasFieldSizeConstants
{
RAS_MaxEntryName = 256,
RAS_MaxPhoneNumber = 128,
RAS_MaxCallbackNumber = RAS_MaxPhoneNumber,
UNLEN = 256,
PWLEN = 256,
DNLEN = 12
}


[
StructLayout(
LayoutKind.Sequential)]

internal
class
RASDIALEXTENSIONS
{

public
readonly
int dwSize =
Marshal.SizeOf(
typeof(
RASDIALEXTENSIONS));

public
uint dwfOptions = 0;

public
int hwndParent = 0;

public
int reserved = 0;

public
int reserved1 = 0;

public
string RasEapInfo =
null;
}


[
StructLayout(
LayoutKind.Sequential, CharSet =
CharSet.Auto)]

internal
class
RASDIALPARAMS
{

public
int dwSize =
Marshal.SizeOf(
typeof(
RASDIALPARAMS));
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.RAS_MaxEntryName + 1)]

public
string szEntryName =
null;
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.RAS_MaxPhoneNumber + 1)]

public
string szPhoneNumber =
null;
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.RAS_MaxCallbackNumber + 1)]

public
string szCallbackNumber =
null;
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.UNLEN + 1)]

public
string szUserName =
null;
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.PWLEN + 1)]

public
string szPassword =
null;
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = (
int)
RasFieldSizeConstants.DNLEN + 1)]

public
string szDomain =
null;

public
int dwSubEntry = 0;

public
int dwCallbackId = 0;
}



public RAS()
{


}



public
uint Dial(
string Connection,
string Username,
string Password)
{

RASDIALPARAMS RDP =
new
RASDIALPARAMS();

uint Resp;

RDP.dwSize =
Marshal.SizeOf(
typeof(
RASDIALPARAMS));
RDP.szEntryName = Connection;
RDP.szPhoneNumber =
"0860880880";
RDP.szCallbackNumber =
"";
RDP.szUserName = Username;
RDP.szPassword = Password;
RDP.szDomain =
"";

Resp = RasDial(
IntPtr.Zero,
null, RDP, 0U,
null,0);


return Resp;


}
}}

La connection ne se fait toujours pas! et la variable Resp me renvoie le code 87 ( normalement c'est 0 si la connection se fait)

Je crois que je vais passer le message dans la section "Au Secours!" :)

je desespere ...(j'ai jusqu'a la fin de semaine pour realiser la beta 1 et je suis loin d'avoir terminé)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 17:24
Là au moins ca ressemble à du PInvoke, rien à voir avec le premier code : )

C'est quoi ce code d'erreur !!?

Essaye de remplacer les chaines null par String.Empty;
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 17:44
Nan, je pensais que la fonction attendait une chaine vide mais ce n'est pas ca. Je connais pas cette API donc je peux pas te dire si tu passes les bons paramètres, mais apparemment je ne vois pas de problème avec PInvoke.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 17:51
Je ne vois pas la structure RASEAPINFO !?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 août 2005 à 17:53
Remarque, tu ne t'en sert pas..
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 août 2005 à 19:48
"Cool le site http://pinvoke.net/, ça vaut la peine de le mettre dans les favorites !
Merci "
Tu ne l'avais pas encore mit ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
kourech_taheraly Messages postés 2 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 8 juillet 2009
7 oct. 2005 à 08:50
Bonjour,
Je voudrai faire la même chose que toi mais sous VB.Net tu sais comment faire par hasard ?
Je fais du VB.NET Embarqué sous Windows CE.NET 4.2

Peux-tu m'expliquer ce que je dois faire ?
Voici mon mail kourech_taheraly@hotmail.com
@+
0
cs_nadjim Messages postés 24 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 29 avril 2010
4 janv. 2006 à 16:53
Bonjour ce code est très interressant mais j'aurai besoin d'énumerer toutes les connexions actives du PC. Pour cela j'utilise RasEnumEntries.
int cb Marshal.SizeOf(typeof(RASENTRYNAME)), entries 0;
RASENTRYNAME[] entryNames = new RASENTRYNAME[8];
entryNames.Initialize();
entryNames[0].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME));

uint nRet = RasEnumEntries(IntPtr.Zero, IntPtr.Zero, entryNames, ref cb, ref entries);
if (entries == 0) return;
String[] _EntryNames = new string[entries];
entryNames = new RASENTRYNAME[entries];
for (int i = 0; i < entries; i++)
entryNames[i].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME));
nRet = RasEnumEntries(IntPtr.Zero, IntPtr.Zero, entryNames, ref cb, ref entries);
for (int i = 0; i < entries; i++)
{
_EntryNames[i] = entryNames[i].szEntryName;
MessageBox.Show(entryNames[i].szEntryName);
}

Le problème est que la fonction RasEnumEntries retourne constament l'erreur 632. Ce qui signifie que la taille de la structure n'est pas correcte. Pourriez vous m'aider merci.

nadjim
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
4 janv. 2006 à 21:42
Comment as tu définie la structure RASENTRYNAME ?

/*
coq
MVP Visual C#
*/
0
cs_nadjim Messages postés 24 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 29 avril 2010
5 janv. 2006 à 19:09
Je l'ai déclaré avec ce code

[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
struct RASENTRYNAME
{
public int dwSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256 + 1)]
public string szEntryName;
public int dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260 + 1)]
public string szPhonebookPath;
}

nadj
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 janv. 2006 à 21:26
"[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]"
Je dirais plutôt
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
voire
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

Essaie pour voir et tiens nous au courant. :-)
Sinon n'oublie pas que les membres dwFlags et szPhonebookPath ne sont pas à spécifier sur un système inférieur à Windows 2000.

/*
coq
MVP Visual C#
*/
0
cs_nadjim Messages postés 24 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 29 avril 2010
5 janv. 2006 à 21:34
"[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]"
Je dirais plutôt
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
voire
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
__________________________________________________
J'avais déjà essayé [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
et là je viens d'essayer [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] mais je trouve toujours la même erreur.

nadj
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 janv. 2006 à 21:38
Tu es bien sur un Win 2000 ou sup ?

/*
coq
MVP Visual C#
*/
0
Rejoignez-nous