Openen en Sluiten van UDP socket

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • DarthVader072
  • Registratie: September 2020
  • Laatst online: 14-10-2020
Hi allen,
Voor mijn winform applicatie maak ik gebruik van 2 forms.
Beide gebruiken een UDP socket waarbij UDP gestuurd word en ontvangen.

Form1 is mijn hoofdscherm, welk nooit gesloten word
Form 2 is een kleiner configuratiescherm welke geopend en gesloten kan worden middels Form1

In de form kan je de bestemming IP en poort invullen.
Dit werkt in principe heel goed, echter door het toevoegen van het scherm krijg ik nog foutmeldingen met 'Cannot access diposed object'. Ik weet wat het inhoud, ik snap het denk ik ook, online is er veel over te lezen.

Wat ik vooral uit begrijp is wanneer je Client.Close(); doet dat hij niet meer te openen is..
Disposed = verwijderd..

Een volgorde waarin het altijd mis gaat:
- Starten applicatie --> Form1 opent --> gegevens invullen (IP/poort) en toepassen(in principe begint hier ook de UDP socket) .
- Openen Form2 (via een advanced button) --> hier word in form1 de Client gesloten (Client.Close();)
- Form2 starten Client
- Form2 scherm sluiten --> Client word gesloten --> Form1 weer gegevens invullen
- Op moment van toepasssen verschijnt er de foutmelding

Ik loop eigenlijk al vrij lang hiermee te stoeien, als ik de Client Close niet gebruik, dan krijg ik nog veel meer foutmeldingen omdat ze botsen (je kan natuurlijk niet meerdere sockets op dezelfde poort gebruiken)

Ik ben dan ook heel erg benieuwd of iemand hier mij hierbij kan helpen?
Deze vraag heb ik ook al op Stackoverflow gevraagd maar de mensen zijn daar niet heel sociaal :P
Ik deel graag mijn code.

..

Alle reacties


Acties:
  • +1 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Waarom sluit je de client in Form1?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat @Janoz zegt. Verder: Als je eens (de revelevante(!) stukjes(!)) code post m.b.v. code tags.

Tot slot: waarom gebruik je überhaupt UDP als je berichten binnen dezelfde applicatie blijven? Er zijn vele efficiëntere manieren om data van FormX naar FormY te krijgen ;) Of begrijp ik nu je toepassing verkeerd?

[ Voor 26% gewijzigd door RobIII op 28-09-2020 14:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DarthVader072
  • Registratie: September 2020
  • Laatst online: 14-10-2020
RobIII schreef op maandag 28 september 2020 @ 14:02:
[...]

Wat @Janoz zegt. Verder: Als je eens (de revelevante(!) stukjes(!)) code post m.b.v. code tags.

Tot slot: waarom gebruik je überhaupt UDP als je berichten binnen dezelfde applicatie blijven? Er zijn vele efficiëntere manieren om data van FormX naar FormY te krijgen ;) Of begrijp ik nu je toepassing verkeerd?
Dank voor je reactie.
Mijn applicatie stuurt UDP pakketten naar externe apparatuur. Simpele commando's om iets aan te sturen.
Ik heb 1 hoofdscherm waarmee je een specifiek apparaat kiest waarmee je wilt communiceren, en een kleiner 'advanced' scherm met doel dat je externe apparatuur een ander oproep-adres kan geven.

Ik sluit de connectie in form1 omdat ik anders meer foutmeldingen krijg. Dit komt vooral omdat ik in dat geval een 2e connectie probeer te maken op een specifieke poort. Die specifieke poort heb ik in principe wel nodig omdat dat bij die apparatuur hoort. Het luisteren naar UDP heb ik dus ook nodig om dingen te verifieren.

Oke ik probeer wat uit te leggen met code.

Dit is het knopje waarmee het advanced (form2) geladen wordt. Ik gebruik dus Client.Close() hier, ook gebruik ik een boolean die aangeeft dat er datatraffic in de advanced(form2) is toegestaan, de datatrafficmain(form1) word naar false gezet.
Overigens dit stuk werkt, ik kan vanuit mijn hoofdscherm een advanced scherm openen en vanuit daar UDP sturen/ontvangen zonder problemen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void tableStatus_Click(object sender, EventArgs e) 
        {
            cleanScreen();
            closeClient();
            Variables.dataTrafficAllowdAdvanced = true;
            var a = new Advanced();
            a.ShowDialog();
        }

        private void closeClient()
        {
            Variables.dataTrafficAllowdMain = false;
            Client.Close();
        }



Dan heb ik hier het stukje waar ik het advanced scherm sluit(form2)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void advancedClose_Click(object sender, EventArgs e)
        {
            Variables.dataTrafficAllowdAdvanced = false;
            Client2.Close();
            
            confirmPin = false;
            newPinAllowed = false;
            statePin = false;

            this.Hide();
            this.Parent = null;
            //s.externalTrigger();
            Variables.dataTrafficAllowdMain = true;
        }


Hierna nog geen problemen tot ik dit doe:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      void ButtonApply_Click(object sender, EventArgs e)
        {
            checkPort();
            checkIP();

            if (ipSet == true && portSet == true && Variables.dataTrafficAllowdAdvanced == false)
            {
                Variables.dataTrafficAllowdMain = true;
                TextBoxActiveIP.Text = TextBoxIP.Text;
                TextBoxActivePort.Text = TextBoxPort.Text;
                TextBoxActiveIP.BackColor = Color.DarkGreen;
                TextBoxActivePort.BackColor = Color.DarkGreen;
                TextBoxActiveIP.ForeColor = Color.Red;
                TextBoxActivePort.ForeColor = Color.Red;
                LogControl.Write("IP address is set manual to: " + TextBoxActiveIP.Text + ", Port number is set manual to: " + TextBoxActivePort.Text);
                UDPstart();

            }
        }


Ik doe hier een UDP start, waarna hij de foutmelding aangeeft. Op dat moment kan ik niet meer sturen en niet meer ontvangen. Foutmelding: Cannot access diposed object
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        void UDPstart() //add-in
        {
            if (Variables.dataTrafficAllowdMain)
            {
                try
                {
                    Client.BeginReceive(new AsyncCallback(recv), null);
                }
                catch (Exception ex)
                {
                    RichTextBoxToReceive.Text += ex.Message.ToString();
                }
            }
        }

        public void recv(IAsyncResult res) //add-in
        {
            IPEndPoint RemoteIp = new IPEndPoint(IPAddress.Any, 1821);

            if (Variables.dataTrafficAllowdMain)
            {
                byte[] received = Client.EndReceive(res, ref RemoteIp);
                data = Encoding.UTF8.GetString(received);

                this.Invoke(new MethodInvoker(delegate
                {
                    LogControl.Write(data);

                    RichTextBoxToReceive.Text += "\n" + DateTime.Now.ToString("HH:mm:ss") + ": " + data;
                }));

                Client.BeginReceive(new AsyncCallback(recv), null);
            }
        }


Afbeeldingslocatie: https://tweakers.net/i/41qNcveqjqclyM8UXbYdL30Lu0w=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/pA6DEHx0WZOSJfyOdF2ndxfE.png?f=user_large

Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 11-09 21:00
Ik word niet veel wijzer van de code die je laat zien, maar zoals je in de documentatie kunt lezen ruimt Close de socket op. Wat je uit de foutmelding kunt opmaken probeer je iets te doen met Client (of Client2) nadat je Close hebt aangeroepen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ah, dat vermoede ik al. Je hebt je complete logica geïmplementeerd in je forms en komt nu in de problemen omdat je meerdere forms hebt. Je moet niet je verbinding sluiten in form1 en weer openen in form2. Je zult de controle van de verbinding 'over moeten geven' van form1 naar form2.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • DarthVader072
  • Registratie: September 2020
  • Laatst online: 14-10-2020
Janoz schreef op maandag 28 september 2020 @ 14:32:
Ah, dat vermoede ik al. Je hebt je complete logica geïmplementeerd in je forms en komt nu in de problemen omdat je meerdere forms hebt. Je moet niet je verbinding sluiten in form1 en weer openen in form2. Je zult de controle van de verbinding 'over moeten geven' van form1 naar form2.
Ja dat is inderdaad exact wat ik zoek!
Zijn hier voorbeelden van, hoe dat te doen?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Je moet je verbindingscode niet in je form implementeren, maar je moet een aparte class maken waarin je je verbinding bijhoud. Vervolgens zorg je dat deze class beschikbaar is in beide forms zodat je vanuit beide forms methoden aan kunt roepen.

En als je daar mee bezig bent, geef dan gelijk ook je forms fatsoenlijke namen. Form1 zegt namelijk helemaal niks over de functie van dat form.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1