Probleme de Connection RAS [Résolu]

cs_rebelmind 6 Messages postés jeudi 14 octobre 2004Date d'inscription 4 août 2005 Dernière intervention - 1 août 2005 à 13:20 - Dernière réponse :  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.
Afficher la suite 

Votre réponse

30 réponses

Meilleure réponse
cs_rebelmind 6 Messages postés jeudi 14 octobre 2004Date d'inscription 4 août 2005 Dernière intervention - 2 août 2005 à 12:40
3
Merci
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...

Merci cs_rebelmind 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de cs_rebelmind
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 13:49
0
Merci
Salut, pour passer une structure null il faut utiliser IntPtr.Zero et pour simuler un pointeur sur une stucture c'est ref myStruct.
Commenter la réponse de Lutinore
cs_rebelmind 6 Messages postés jeudi 14 octobre 2004Date d'inscription 4 août 2005 Dernière intervention - 1 août 2005 à 14:02
0
Merci
Merci pour la rapidité de reponse.
je debute sous DOT NET

tu pourrais illustrer ta solution

merci beaucoup
Commenter la réponse de cs_rebelmind
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 15:19
0
Merci
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 !?
Commenter la réponse de Lutinore
cs_rebelmind 6 Messages postés jeudi 14 octobre 2004Date d'inscription 4 août 2005 Dernière intervention - 1 août 2005 à 15:52
0
Merci
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
Commenter la réponse de cs_rebelmind
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 1 août 2005 à 16:10
0
Merci
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
Commenter la réponse de cs_Bidou
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 16:23
0
Merci
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à..
Commenter la réponse de Lutinore
cs_rebelmind 6 Messages postés jeudi 14 octobre 2004Date d'inscription 4 août 2005 Dernière intervention - 1 août 2005 à 16:49
0
Merci
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é)
Commenter la réponse de cs_rebelmind
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 17:24
0
Merci
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;
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 17:44
0
Merci
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.
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 17:51
0
Merci
Je ne vois pas la structure RASEAPINFO !?
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 1 août 2005 à 17:53
0
Merci
Remarque, tu ne t'en sert pas..
Commenter la réponse de Lutinore
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 août 2005 à 19:48
0
Merci
"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#
Commenter la réponse de cs_coq
kourech_taheraly 2 Messages postés mardi 10 mai 2005Date d'inscription 8 juillet 2009 Dernière intervention - 7 oct. 2005 à 08:50
0
Merci
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
@+
Commenter la réponse de kourech_taheraly
cs_nadjim 24 Messages postés mardi 18 décembre 2001Date d'inscription 29 avril 2010 Dernière intervention - 4 janv. 2006 à 16:53
0
Merci
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
Commenter la réponse de cs_nadjim
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 janv. 2006 à 21:42
0
Merci
Comment as tu définie la structure RASENTRYNAME ?

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
cs_nadjim 24 Messages postés mardi 18 décembre 2001Date d'inscription 29 avril 2010 Dernière intervention - 5 janv. 2006 à 19:09
0
Merci
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
Commenter la réponse de cs_nadjim
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 5 janv. 2006 à 21:26
0
Merci
"[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#
*/
Commenter la réponse de cs_coq
cs_nadjim 24 Messages postés mardi 18 décembre 2001Date d'inscription 29 avril 2010 Dernière intervention - 5 janv. 2006 à 21:34
0
Merci
"[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
Commenter la réponse de cs_nadjim
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 5 janv. 2006 à 21:38
0
Merci
Tu es bien sur un Win 2000 ou sup ?

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.