Avatar billede amews_aj Nybegynder
05. maj 2006 - 17:32 Der 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?
Avatar billede arne_v Ekspert
05. maj 2006 - 17:46 #1
lyder som det er en windows app (GUI)

loesningen maa vaere at koere den kode i en separart traad
Avatar billede amews_aj Nybegynder
05. maj 2006 - 17:50 #2
(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.
Avatar billede arne_v Ekspert
05. maj 2006 - 18:06 #3
i stedetfor at kalde:

pingit();

kalder du:

(new Thread(new ThreadStart(pingit))).Start();
Avatar billede arne_v Ekspert
05. maj 2006 - 18:06 #4
men du skal vel egentligt have wn while loekke saa du kan acceptere flere connections !?!?
Avatar billede amews_aj Nybegynder
05. maj 2006 - 18:20 #5
Ja den del virker nu...

Men jeg mangler fortsat en måde at stoppe den på... Jeg skal kunne stoppe den uden at lukke programmet:




    class Server
    {

       

        private TcpListener server;
        private TcpClient client;
        private StreamReader rdr;
        private StreamWriter wrt;
        string die = "false";

        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?
Avatar billede arne_v Ekspert
05. maj 2006 - 18:40 #6
med while loekken behoever du ikke starte en traad inden i pingit
Avatar billede amews_aj Nybegynder
05. maj 2006 - 18:43 #7
nåå nej, men stadig, hvordan kan jeg starte/stoppe dette?
Avatar billede arne_v Ekspert
05. maj 2006 - 18:47 #8
enten kan du:

ditserverobjekt.die = "true";

saa stopper den efter naeste connection

[hvorfor bruger du string og ikke bool ??]

hvis du bruger:

Thread t = new Thread(new ThreadStart(pingit));
t.Start();

saa kan du ogsaa proeve:

t.Interrupt();
t.Join();
Avatar billede amews_aj Nybegynder
05. maj 2006 - 18:53 #9
Hmm... Hvordan får jeg dette til at virke, lige nu kan den jo ikke finde t.Join og t.Interrupt


        public void stoppingit
        {
            t.Interrupt();
        }

        public void continuepingit
        {
            t.Join();
        }

        public void Run()
        {
            server = new TcpListener(IPAddress.Any, 80);
            server.Start();
            Thread t = new Thread(new ThreadStart(pingit));
            t.Start();
        }
Avatar billede arne_v Ekspert
05. maj 2006 - 19:00 #10
private Thread t;
        public void stoppingit
        {
            t.Interrupt();
            t.Join();
        }

        public void Run()
        {
            server = new TcpListener(IPAddress.Any, 80);
            server.Start();
            t = new Thread(new ThreadStart(pingit));
            t.Start();
        }
Avatar billede amews_aj Nybegynder
05. maj 2006 - 19:02 #11
Objektreferencen er ikke indstillet til en forekomst af et objekt.
Avatar billede amews_aj Nybegynder
05. maj 2006 - 19:50 #12
hvad gør jeg ved det?
Avatar billede arne_v Ekspert
05. maj 2006 - 20:06 #13
Fik du aendret

Thread t = new Thread(new ThreadStart(pingit));

til

t = new Thread(new ThreadStart(pingit));
Avatar billede amews_aj Nybegynder
05. maj 2006 - 20:19 #14
private Thread t;
       

        public void stoppingit()
        {
            t.Interrupt();
            MessageBox.Show("stop");
        }

        public void continuepingit()
        {
            t.Join();
            MessageBox.Show("continue");
        }

        public void Run()
        {
            server = new TcpListener(IPAddress.Any, 80);
            server.Start();
            t = new Thread(new ThreadStart(pingit));
            t.Start();
        }
Avatar billede amews_aj Nybegynder
05. maj 2006 - 20:20 #15
Objektreferencen er ikke indstillet til en forekomst af et objekt.

Fejlen kommer når jeg enten kører stoppingit() eller continuepintit()
Avatar billede amews_aj Nybegynder
05. maj 2006 - 22:50 #16
Nogen ideer ?
Avatar billede amews_aj Nybegynder
06. maj 2006 - 00:01 #17
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;
           
        }
    }

    class Server
    {

       

        private TcpListener server;
        private TcpClient client;
        private StreamReader rdr;
        private StreamWriter wrt;
        private Thread t;
     

        public void Run()
        {

            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");
            }
        }

       
        public void stoppingit()
        {
            try
            {
                t.Abort();
                server.Stop();
                MessageBox.Show("stop");
            }
            catch (Exception e)
            {
                string result = "Exception" + e.Message.ToString();
                MessageBox.Show(result);
            }
        }

        public void continuepingit()
        {
            t.Join();
            MessageBox.Show("continue");
        }
    }


}
Avatar billede amews_aj Nybegynder
06. maj 2006 - 00:04 #18
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.
Avatar billede arne_v Ekspert
06. maj 2006 - 04:50 #19
Join stopper ikke - den venter på at tråden afslutter
Avatar billede arne_v Ekspert
06. maj 2006 - 04:50 #20
hvis du vil starte igen:

            t = new Thread(new ThreadStart(pingit));
            t.Start();
Avatar billede amews_aj Nybegynder
06. maj 2006 - 14:56 #21
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
Avatar billede arne_v Ekspert
07. maj 2006 - 03:07 #22
prøv:

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private Server srv; // <---- herop
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // initialiser global objekt ikke lokal objekt
            srv = new Server();
            srv.Run();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            srv.continuepingit();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            srv.stoppingit();
        }
    }
Avatar billede arne_v Ekspert
07. maj 2006 - 03:08 #23
NB: continueit continuer faktisk ikke ...
Avatar billede amews_aj Nybegynder
07. maj 2006 - 17:18 #24
Nope virker ikke - stadig samme fejl (Ja det med continue ved jeg godt)
Avatar billede arne_v Ekspert
08. maj 2006 - 04:16 #25
kan du poste din kode som den ser ud nu ?
Avatar billede amews_aj Nybegynder
08. maj 2006 - 08:00 #26
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();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            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();
           
            srv = null;
           
        }

        private void button3_Click(object sender, EventArgs e)
        {
           
        }
    }

    class Server
    {

       

        private TcpListener server;
        private TcpClient client;
        private StreamReader rdr;
        private StreamWriter wrt;
        private Thread t;
     

        public void Run()
        {

            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()
        {
            try
            {
                t.Abort();
                server.Stop();
                MessageBox.Show("stop");
            }
            catch (Exception e)
            {
                string result = "Exception" + e.Message.ToString();
                MessageBox.Show(result);
            }
        }

        public void continuepingit()
        {
            t.Join();
            MessageBox.Show("continue");
        }
    }


}
Avatar billede arne_v Ekspert
09. maj 2006 - 04:55 #27
prøv og slet alle:

srv = null;
Avatar billede amews_aj Nybegynder
09. maj 2006 - 14:23 #28
Nope - stadig samme fejl...

bør man ikke fjerne srv af hukommelsen efter brug da ? Synes jeg at jeg har hørt...
Avatar billede arne_v Ekspert
10. maj 2006 - 04:36 #29
mystisk !

må vi se seneste kode + fejl besked inkl. linie nummer ?
Avatar billede amews_aj Nybegynder
10. maj 2006 - 13:31 #30
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();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            srv = new Server();
            srv.Run();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Server srv = new Server();
            srv.continuepingit();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Server srv = new Server();
            srv.stoppingit();
           
        }

        private void button3_Click(object sender, EventArgs e)
        {
           
        }
    }

    class Server
    {

       

        private TcpListener server;
        private TcpClient client;
        private StreamReader rdr;
        private StreamWriter wrt;
        private Thread t;
     

        public void Run()
        {

            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())
Avatar billede amews_aj Nybegynder
13. maj 2006 - 23:45 #31
Nogen ideer?
Avatar billede arne_v Ekspert
13. maj 2006 - 23:50 #32
prøv og slet

Server srv = new Server();

fra button1 og button2 click
Avatar billede amews_aj Nybegynder
13. maj 2006 - 23:57 #33
Yes, det virker, men jeg mangler dog stadig at kunne starte den igen...

        public void stoppingit()
        {
                t.Abort();
                server.Stop();
                MessageBox.Show("stop");
        }

        public void continuepingit()
        {
            server.Start();
            t.Resume();
            MessageBox.Show("continue");
        }

Den vil ikke resume fordi den er abort'et. Hvad gør jeg så ?
Hvordan starter jeg tråden igen?
Avatar billede amews_aj Nybegynder
13. maj 2006 - 23:58 #34
Fandt ud af det...

        public void continuepingit()
        {
            server.Start();
            t = new Thread(new ThreadStart(pingit));
            t.Start();
            MessageBox.Show("continue");
        }

hvordan disconnecter jeg en socket lige efter den har connectet? Den skal bare lige registrere fobindelsen ikek opretholde den
Avatar billede amews_aj Nybegynder
14. maj 2006 - 00:00 #35
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();
            }
        }


Nå men tak for hjælpen - smid et svar...
Avatar billede arne_v Ekspert
14. maj 2006 - 00:39 #36
svar
Avatar billede amews_aj Nybegynder
14. maj 2006 - 00:42 #37
tak for hjælpen ;)
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