05. maj 2006 - 17:32Der er
36 kommentarer og 1 løsning
Svarer ikke (Venter på socket)
Jeg har denne kode:
public void pingit() { client = server.AcceptTcpClient(); rdr = new StreamReader(client.GetStream()); wrt = new StreamWriter(client.GetStream()); MessageBox.Show("Ping received"); pingit(); }
Det er sat ind i en windowsapplication, men mens den står og venter på at en client skal forbinde, så går programmet nærmest i står - altså den siger (Svarer ikke) og man kan intet gøre end at lukke. Hvordan undgår jeg det?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
(Som tidligere nævnt i et andet spørgsmål er jeg helt ny i C#, og gik naturligvis ikke ud i dette script medmindre det var absolut nødvendigt, hvilket det altså er - noget jeg skal bruge)
Kan du forklare lidt mere på begynder niveau - evt. noget kode.
public void setdie(string texten) { this.die = texten;
}
public void Run() { server = new TcpListener(IPAddress.Any, 80); server.Start(); (new Thread(new ThreadStart(pingit))).Start(); }
public void pingit() { while (this.die != "true") { client = server.AcceptTcpClient(); rdr = new StreamReader(client.GetStream()); wrt = new StreamWriter(client.GetStream()); MessageBox.Show("Ping received"); (new Thread(new ThreadStart(pingit))).Start(); } } }
-------------------------
Hvis jeg bare sætter die så står den jo stadig og hænger indtil nogen forsøger at forbinde, og så stopper den while lykken, hvis du forstår. While lykken kører jo kun når en forbinder. Hvordan stopper jeg tråden, og ikke mindst starter den igen?
2. Lige opdaget noget nyt... Hvis jeg kalder stoppingit lige efter t.Start() så virker det fint, men hvis jeg kalder den fra en knap så virker det ikke... :S Den kan så ikke fange t og server - de er tilsyneladende bare null Objektreferencen er ikke indstillet til en forekomst af et objekt.
1. Noget helt andet er at jeg heller ikke kan starte tråden igen efter den er stoppet. Interrupt virker ikke, men Abort() gør. Dog når den er stoppet vil den ikke starte igen via Join() eller Start(). Hvordan gør jeg det?
--------------------------
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading;
namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { Server srv = new Server(); srv.Run(); srv = null; }
private void button1_Click(object sender, EventArgs e) { Server srv = new Server(); srv.continuepingit(); srv = null; }
private void button2_Click(object sender, EventArgs e) { Server srv = new Server(); srv.stoppingit(); // HER GÅR DET GALT! srv = null;
server = new TcpListener(IPAddress.Any, 80); server.Start(); t = new Thread(new ThreadStart(pingit)); t.Start(); stoppingit(); // HER KAN DEN GODT FINDE UD AF DET
}
public void pingit() { while (true) { client = server.AcceptTcpClient(); rdr = new StreamReader(client.GetStream()); wrt = new StreamWriter(client.GetStream()); MessageBox.Show("Ping received"); } }
Skal dog også lige siges at den kode der er slået sammen fra to eksempler - jeg forsøger selvfølgelig ikke at stoppe den to gange. Men hvis jeg stopper den fra Run() så går det fint, men hvis jeg i stedet stopper den fra butten_2Click så går det galt.
Ok, men stadig kan jeg jo ikke stoppe den - den kommer med den fejl som jeg har beskrevet...
Objektreferencen er ikke indstillet til en forekomst af et objekt. Den kommer når jeg forsøger at få adgang til t. Den kan ikke finde den medmindre der henvises til den fra Run() - hvilket ikke skal være tilfældet - det skal være ved tryk på en knap
Kun koden til selve formen jeg poster - bruger MS Visual C# 2005
Koden:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading;
namespace WindowsApplication1 { public partial class Form1 : Form { private Server srv; public Form1() { InitializeComponent(); }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading;
namespace WindowsApplication1 { public partial class Form1 : Form { private Server srv; public Form1() { InitializeComponent(); }
server = new TcpListener(IPAddress.Any, 80); server.Start(); t = new Thread(new ThreadStart(pingit)); t.Start();
}
public void pingit() { while (true) { client = server.AcceptTcpClient(); rdr = new StreamReader(client.GetStream()); wrt = new StreamWriter(client.GetStream()); MessageBox.Show("Ping received"); } }
public void stoppingit() { t.Abort(); server.Stop(); MessageBox.Show("stop"); }
public void continuepingit() { t.Join(); MessageBox.Show("continue"); } }
}
System.NullReferenceException was unhandled Message="Objektreferencen er ikke indstillet til en forekomst af et objekt." ( Det er linjen med t.Abort(); i stoppingit())
og den fandt jeg også ud af ;) while (true) { client = server.AcceptTcpClient(); rdr = new StreamReader(client.GetStream()); wrt = new StreamWriter(client.GetStream()); MessageBox.Show("Ping received"); client.Close(); } }
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.