L-Dlbcq
-
Modifié le 8 mars 2022 à 21:36
L-Dlbcq
Messages postés2Date d'inscriptionsamedi 12 mars 2022StatutMembreDernière intervention19 octobre 2022
-
12 mars 2022 à 19:35
Bonjour,
Je developpe une petite application Winform C# pour retrouver les infos de réseau (IP, masque, passerelle, dns).
Mais depuis j'ai ce problème à l'éxécution du .EXE dans Debug :
System.ArgumentOutOfRangeException: L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index à System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) à System.Collections.Generic.List`1.get_Item(Int32 index) à System.Net.NetworkInformation.IPAddressCollection.get_Item(Int32 index) à NUTs_App.Net_Infos_Form.Get_Infos(Object sender, EventArgs e) dans C:\Users\Louis\source\repos\L-Dlbcq\IP-Address-and-Subnet-Mask-Finder\MainForm.cs:ligne 53 à System.Windows.Forms.Control.OnClick(EventArgs e) à System.Windows.Forms.Button.OnClick(EventArgs e) à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) à System.Windows.Forms.Control.WndProc(Message& m) à System.Windows.Forms.ButtonBase.WndProc(Message& m) à System.Windows.Forms.Button.WndProc(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Assemblys chargés **************mscorlib Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4470.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll----------------------------------------Network Utility Tools - NUTs Version de l'assembly : 1.0.0.0 Version Win32 : 1.0.0.0 CodeBase : file:///C:/Users/Louis/source/repos/L-Dlbcq/IP-Address-and-Subnet-Mask-Finder/bin/Debug/Network%20Utility%20Tools%20-%20NUTs.exe----------------------------------------System.Windows.Forms Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4400.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll----------------------------------------System Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4360.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll----------------------------------------System.Drawing Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4390.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll----------------------------------------System.Configuration Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4190.0 built by: NET48REL1LAST_B CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll----------------------------------------System.Core Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4470.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll----------------------------------------System.Xml Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll----------------------------------------mscorlib.resources Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/mscorlib.resources.dll----------------------------------------System.Windows.Forms.resources Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/System.Windows.Forms.resources.dll----------------------------------------
avez vous une idée de ce que je peux faire pour résoudre ce soucis ?
Voici le code C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Management;
using System.Windows.Forms;
namespace NUTs_App
{
public partial class Net_Infos_Form : Form
{
public Net_Infos_Form()
{
InitializeComponent();
}
private void Get_Infos(object sender, EventArgs e)
{
foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
{
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && adapter.Name == "Ethernet")
{
IP_txtbx.Text = (ip.Address.ToString());
Subnet_txtbx.Text = (ip.IPv4Mask.ToString());
}
foreach (GatewayIPAddressInformation gateway in adapter.GetIPProperties().GatewayAddresses)
{
Gateway_txtbx.Text = gateway.Address.ToString();
}
}
}
IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
IPAddressCollection dnsServers = adapterProperties.DnsAddresses;
if (dnsServers.Count != 0)
{
foreach (IPAddress dns in dnsServers)
{
DNS1_txtbx.Text = dnsServers[1].ToString();
DNS2_txtbx.Text = dnsServers[2].ToString();
}
}
else
{
DNS1_txtbx.Text = "0";
DNS1_txtbx.Text = "0";
}
}
}
private void Close_App(object sender, EventArgs e)
{
this.Close();
}
private void Change_to_FR(object sender, EventArgs e)
{
IP.Text = "Adresse IP";
Subnet.Text = "Masque de sous réseau";
Gateway.Text = "Passerelle par défaut";
DNS1.Text = "DNS primaire";
DNS2.Text = "DNS secondaire";
get_infos_btn.Text = "RECUPERER INFOS";
close_btn.Text = "FERMER";
this.Text = "Network Utility Tools - NUTs";
Language.Text = "Langue";
french_btn.Text = "Français";
english_btn.Text = "Anglais";
}
private void Change_to_EN(object sender, EventArgs e)
{
IP.Text = "IP address";
Subnet.Text = "Subnet Mask";
Gateway.Text = "Default Gateway";
DNS1.Text = "Primary DNS";
DNS2.Text = "Secondary DNS";
get_infos_btn.Text = "RETRIEVE INFOS";
close_btn.Text = "CLOSE";
this.Text = "Network Utility Tools - NUTs";
Language.Text = "Language";
french_btn.Text = "French";
english_btn.Text = "English";
}
}
}
J’ai compris qu’il s’agissait de l’appel d’une collection vide mais pourtant dans le cas où je lance l’app depuis le dossier Debug, j’ai bien deux adresses qui sont écrite dans les champs textes prévu à cet effet.
J’ai beau fouiller sur MSDN, Stackoverflow je ne trouve aucune alternative.
dnsServers.Count me renvoi System.Net.NetworkInformation.IPAddressCollection
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621
>
L-Dlbcq
11 mars 2022 à 23:07
ha ben voilà qui est étonnant, puisque Count est sensé renvoyer un nombre entier...
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165
>
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023 11 mars 2022 à 23:15
Bonsoir Whis
C'est dnsServers qui renvoie System.Net.NetworkInformation.IPAddressCollection
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621
>
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023 12 mars 2022 à 00:00
Oui je sais ;), mais je voulais qu'il cherche par lui même
Vous n’avez pas trouvé la réponse que vous recherchez ?
En lançant le projet avec Visual Studio, l'erreur intervient ligne 46, c'est à dire au moment où je tente d'inscrire la valeur dnsServers[1] dans DNS1_txtbx
D'après certains dev avec qui j'ai pu aussi discuter, il s'agit du fait que dnsServers, membre de IPAddressCollection est une collection vide.
Voici le code complet:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Management;
using System.Windows.Forms;
namespace Address_and_Subnet_Mask_Finder
{
public partial class Network_Infos_Form : Form
{
public Network_Infos_Form()
{
InitializeComponent();
}
private void Get_Infos(object sender, EventArgs e)
{
foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
{
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
string myIP = (ip.Address.ToString());
IP_txtbx.Text = myIP;
string mySubnet = (ip.IPv4Mask.ToString());
Subnet_txtbx.Text = mySubnet;
}
}
IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
IPAddressCollection dnsServers = adapterProperties.DnsAddresses;
if (dnsServers.Count > 0)
{
foreach (IPAddress dns in dnsServers)
{
DNS1_txtbx = dnsServers[1].ToString();
DNS2_txtbx = dnsServers[2].ToString();
}
}
}
}
}
private void Close_App(object sender, EventArgs e)
{
this.Close();
}
}
}
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165 12 mars 2022 à 12:49
Bonjour
dnsServers.Count
ne peut pas être = à 0 car dans ce cas tu ne passerais pas pas la boucle
vb95
Messages postés3406Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention20 mars 2023165 11 mars 2022 à 23:12
Bonjour
Vous dîtes "D'après certains dev avec qui j'ai pu aussi discuter, il s'agit du fait que dnsServers, membre de IPAddressCollection est une collection vide." C'est pour cela que je vous ai demandé quelle était la valeur de
car dans certains cas aux ligne 46 et 47 les 2 DNS sont identiques alors que dans d'autres ils sont différents . Et c'est pour cela que je vous ai demandé la valeur de
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621 12 mars 2022 à 07:51
Bonjour
tu es débutant, OK, ça arrive à tout le monde.
Mais tu présentes un code qui n'a rien d'un code de débutant.
Donc soit tu n'es plus si débutant que ça, soit tu as brulé les étapes (et ça ça arrive aussi à beaucoup de gens, moi y compris il y a des années) et tu as trouvé ça sur internet et tu essayes de le modifier plus ou moins au pif.
Si tu as brulé les étapes, et bien figure toi, ça ne marche pas.
On finit toujours pas bloquer quelque part car il y a des bases que l'on a pas acquises.
Donc je te propose de laisser ton projet de coté quelques jours. De prendre le temps de lire ce cours https://tahe.developpez.com/dotnet/csharp/ et ensuite de revenir à ton projet.
Ce cours ne fera pas de toi un codeur expert, mais tu y trouveras le socle nécessaire à débuter ta formation.
Et en plus on aura un langage commun, quand on te demanderas de nous donner ce que retourne une variable, tu sauras ce que ça veut dire et donc ensemble on débugguera plus vite.
Après avoir relu la page sur l'IPAddressCollection.DnsServers, j'ai compris ou était mon erreur. Il manquait ce code spécifique:
public
IPAddressCollection
DnsAddresses { get; }
Après l'avoir réintégrer au code, il me fallait récupérer les adresses DNS correspondante à la carte ET en forme IPv4 (j'ai rencontré une erreur mais assez vite résolu).
Ceci donne donc la chose suivante dans mon programme:
foreach(NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
IPAddressCollection dnsServers = adapterProperties.DnsAddresses;
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
{
if (dnsServers.Count > 0 && ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
foreach (IPAddress dns in dnsServers)
{
primdns_TxtBx1.Text = dnsServers[0].ToString();
secdns_TxtBx1.Text = dnsServers[1].ToString();
}
}
}
}
}
Et en débogguant ou en executant le .EXE du répertoire Debug, plus aucune erreur !
Je tiens a repréciser que j'avais déjà fait quelques applications CSharp mais jamais utiliser de collection, c'est pourquoi je vais prendre le temps de lire le cours que tu m'as conseillé. En tout cas merci d'avoir pu m'apporter de l'aide !