Avatar billede spif2001 Nybegynder
23. december 2005 - 12:43 Der er 12 kommentarer og
2 løsninger

string til byte (IP adresse)

Hej og god jul til alle!

Jeg har en lille form med 4 textbox'e. I de 4 box'e indtaster brugeren 4 tal, der tilsammen danner en IP adresse.

Indtastningen skal jeg have valideret og skrevet ned i Windows' hosts fil.

Spørgsmål:

Hvordan får jeg smartest valideret de 4 strings og lavet dem til en IP string?

Jeg har følgende kode, men synter ikke det virker særlig genialt:

private void buttonOK_Click(object sender, System.EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    bool success = this.CheckIPAddress();
    if(success)
    {
        string addressString = this.textBoxIP1.Text+".";
        addressString += this.textBoxIP2.Text+".";
        addressString += this.textBoxIP3.Text+".";
        addressString += this.textBoxIP4.Text;

        System.IO.StreamWriter fileWriter = new System.IO.StreamWriter(@"C:\WINDOWS\system32\drivers\etc\hosts",true);
        fileWriter.WriteLine(addressString + "  myserver");
        fileWriter.Close();
        this.Close();
    }//if           
    Cursor.Current = Cursors.Default;
}

private bool CheckIPAddress()
{
    byte checkByte = 0;
    bool success = true;
    try
    {
        checkByte = Convert.ToByte(this.textBoxIP1.Text);
        this.textBoxIP1.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP1.BackColor = Color.Red;
        success = false;
    }
    try
    {
        checkByte = Convert.ToByte(this.textBoxIP2.Text);
        this.textBoxIP2.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP2.BackColor = Color.Red;
        success = false;
    }
    try
    {
        checkByte = Convert.ToByte(this.textBoxIP3.Text);
        this.textBoxIP3.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP3.BackColor = Color.Red;
        success = false;
    }
    try
    {
        checkByte = Convert.ToByte(this.textBoxIP4.Text);
        this.textBoxIP4.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP4.BackColor = Color.Red;
        success = false;
    }
    return success;
}
Avatar billede arne_v Ekspert
23. december 2005 - 12:47 #1
IPAddress.Parse of catch FormatException måske
Avatar billede spif2001 Nybegynder
23. december 2005 - 12:52 #2
mmjaa - har nok skrevet for lidt til mit spørgsmål, men hvis du ser koden i min CheckIPAddress(), så gør jeg de "dårlige" tal røde - og det vil jeg gerne blive ved med.
Avatar billede arne_v Ekspert
23. december 2005 - 12:57 #3
Hvis du vil bibeholde at de enkelte bytes bliver røde individuelt så tror jeg ikke
at du kan gøre det meget smartere
Avatar billede spif2001 Nybegynder
23. december 2005 - 13:03 #4
Brugte din Parse alligevel, og nøjes med at kalde CheckIPAddress() (nu RepaintTextBoxes()) når den smider en exception.

private void buttonOK_Click(object sender, System.EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    string addressString = this.textBoxIP1.Text+".";
    addressString += this.textBoxIP2.Text+".";
    addressString += this.textBoxIP3.Text+".";
    addressString += this.textBoxIP4.Text;

    try
    {
        IPAddress.Parse(addressString);
        StreamWriter fileWriter = new StreamWriter(@"C:\WINDOWS\system32\drivers\etc\hosts",true);
        fileWriter.WriteLine(addressString + "  funkiserver");
        fileWriter.Close();
        this.Close();                   
    }//try
    catch
    {
        this.RepaintTextBoxes();
    }//catch
    Cursor.Current = Cursors.Default;
}

private void RepaintTextBoxes()
{
    try
    {
        Convert.ToByte(this.textBoxIP1.Text);
        this.textBoxIP1.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP1.BackColor = Color.Red;
    }
    try
    {
        Convert.ToByte(this.textBoxIP2.Text);
        this.textBoxIP2.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP2.BackColor = Color.Red;
    }
    try
    {
        Convert.ToByte(this.textBoxIP3.Text);
        this.textBoxIP3.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP3.BackColor = Color.Red;
    }
    try
    {
        Convert.ToByte(this.textBoxIP4.Text);
        this.textBoxIP4.BackColor = Color.White;
    }
    catch
    {
        this.textBoxIP4.BackColor = Color.Red;
    }
}

Smid du bare et svar :)
Avatar billede Syska Mester
23. december 2005 - 13:28 #5
Den kan jo også næsten kun bruges :-)

"0.168.32.1" tager den som en valid ip :-(

// ouT
Avatar billede spif2001 Nybegynder
23. december 2005 - 13:32 #6
ja, men hvordan vil du ellers tjekke om IP'en er gyldig?
Avatar billede Syska Mester
23. december 2005 - 13:37 #7
Well, der er jo nogle Ip'er der den tager som gyldige men hvor du skal bruge dem alligevel ikke kan bruges....

Der er vel ikke meget andet ned at lave lidt flere tests....

"192.168.32.0" // angiver et net
"0.168.32.192" // kan ikke være 0 i første octet, da det angiver nettet
"192.168.32.255" // en broadcast adresse

Så jeg tror du må ind og test på de forskellige felter....

// ouT
Avatar billede Syska Mester
23. december 2005 - 13:38 #8
Der er sikkert flere som ikke er gyldige... men kan ikke lige komme på dem.... det kommer jo også an på hvad subnet masken er...
Avatar billede spif2001 Nybegynder
23. december 2005 - 14:17 #9
Har siddet og fedtet lidt med det...

Hvad med denne her?


[code]
private void buttonOK_Click(object sender, System.EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    string addressString = this.textBoxIP1.Text + "."
        + this.textBoxIP2.Text + "."
        + this.textBoxIP3.Text + "."
        + this.textBoxIP4.Text;

    StreamWriter fileWriter = null;
    try
    {
        IPAddress.Parse(addressString);
        Dns.GetHostByAddress(addressString);
       
        fileWriter = new StreamWriter(@"C:\WINDOWS\system32\drivers\etc\hosts",true);
        fileWriter.WriteLine(addressString + "  funkiserver");
        fileWriter.Close();
        this.Close();
    }//try
    catch(FormatException)
    {
        this.ChangeTextBoxColors();
    }//catch
    catch(System.Net.Sockets.SocketException)
    {
        MessageBox.Show(addressString + " is not a valid intra net IP address!","Invalid IP address");
    }//catch
    catch
    {
        if(fileWriter != null)
            fileWriter.Close();
        this.Close();
    }//catch
    Cursor.Current = Cursors.Default;
}//buttonOK_Click

[/code]

Hvis Dns.GetHostByAddress(addressString); smider en System.Net.Sockets.SocketException, er det vel fordi den ikke kan finde den.

IP adressen der skal indtastes, er fra et lokalt netværk.
Avatar billede Syska Mester
23. december 2005 - 14:31 #10
ja, det virker ikke helt dumt :-)

Så er den vist også ved at være der.

// ouT
Avatar billede spif2001 Nybegynder
23. december 2005 - 14:35 #11
ok :) - svarer I begge to, så kan I dele.

Det er jo jul ;)
Avatar billede Syska Mester
23. december 2005 - 14:36 #12
:-)

svar
Avatar billede arne_v Ekspert
23. december 2005 - 15:30 #13
du skal lige være klar over hvad det test med Dns.GetHostByAddress gør

det tester:

(er der en DNS entry for den pågældende IP adresse) OR (maskinen er tilgængelig)

hvilket muligvis er fint nok for dig, men det er ikke det samme som at teste
for om en IP adresse er valid (maskiner uden navn som ikke er tilgængelige og
ledige IP adresser vil give forskelligt resultat)
Avatar billede arne_v Ekspert
23. december 2005 - 15:30 #14
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester