Avatar billede Slettet bruger
29. juli 2006 - 20:32 Der er 8 kommentarer

UDP "ping" funktion

Jeg er igang med et simpelt p2p LAN project. Det bygger udelukkende på UDP. Derfor skal jeg bruge en ping funktion der tjekker om clienterne stadig er der.

Jeg har et Array hvor mine Endpoints til alle clienter ligge i, det skal den gå igennem hvert 10 sek fx, og sende en "pingstatus" som string til den, og den anden skal så svarer med "pinganswer" fx. Problemet jeg løb ind i var, at jeg brugte en ReceiveTimeout på 200 ms. Men da begge to, eller alle, skal tjekke hinanden, så får den jo ikke timeout, da den anden spørger også.. hmm svært at forklare..

Men jeg skal bruge en simpelt funktion der virker begge veje jo, så de også kan tjekke hinanden samtidigt. På forhånd tak
Avatar billede bufferzone Praktikant
29. juli 2006 - 21:36 #1
Det bliver vandskeligt, dels er UDP og ICMP to forskellige protokoller (hvilket du sikkert ved når ping er i citationstegn) og dels er udp connection less hvilket betyder at der ikke svares på udp. Du skal altså finde en metode der går ud over udp protekollen og ikke anvender icmp. Det bliver vandskeligt
Avatar billede Slettet bruger
29. juli 2006 - 21:43 #2
Havde bare tænkt mig at lave det så den ene sender en "pingstatus" string, og når den anden modtager det, svarer den bare med "pinganswer" og hvis ipen passer på det den modtager, med det den sendte til, så er den der jo stadig
Avatar billede preben.m Nybegynder
30. juli 2006 - 02:26 #3
Hvis det hele skal køre på et Lan kan du jo lave et UDP broadcast, hvis det skal være fint kan nu lave det som Multicast. Alle klienter skal så svare på den port du nu har valgt, serveren vil da lytte på en echo reply kunne være den samme som du oprindeligt sendte echo forspøgelsen på. Hvis du vælger at bruge unicast. så er det heller ikke noget problem du skal bare bruge flere timere/irq's lad evt håndtering på server siden ske i en tråd
Avatar billede Slettet bruger
30. juli 2006 - 12:28 #4
Der er ikke noget der hedder client og server i et p2p netværk. Alle clienter er fuldkomment ens og kan kommunikere sammen alle sammen. Der er ikke nogen server der "holder øje" med noget.

Derfor skal hver client med et mellemrum tjekke status på de endpoints den har i sit array. Når man lukker clienten normalt, vil den sende en discconnect string til hver client den kender til, for at fortælle at den logger af. Det virker 100%. Men denne funktion skal virke som en backup. For hvis programmet lukker af en fejl eller lignene. Vil den jo ikke sende den disconnect string, og vil derfor stadig ses online hos alle de andre.

Den skal blot sende en string, og får den IKKE svar inden for et bestemt tidsrum, smider den clienten af sin liste, da han må være offline!
Avatar billede preben.m Nybegynder
30. juli 2006 - 19:26 #5
Jeg er helt med på hvad du mener med P2P, men når jeg skriver server og klient er det mere situations bestemt, men kan udlede at P2P køre efter et server/client paradigme. du kan meget let teste om klient stadig er i live med udp, du kan læse om i rfc 862, det er meget hurtig klaret, hvis du ønsker status om andre P2P's forbindelser til din P2P, bevæger man sig hurtig over i nogle af de teknologier der benyttes ved tcp forbindelser. Du kan jo vælge hvilke af disse der er relavante for dig og herefter implementere dem.
Avatar billede Slettet bruger
30. juli 2006 - 20:02 #6
Hvor er Arne når man har brug for ham! :)

Kan ikke lige finde noget brugbart om rfc 862
Avatar billede preben.m Nybegynder
30. juli 2006 - 23:16 #7
RFC 862 siger ikke meget om implimentering, for at sige det mildt. Jeg tænkte bar at du kunne bruge noget af tankegangen bag. Jeg har lavet et projekt der ligner det du beskriver i java, jeg kunne ikke lige finde koden, men jeg kan prøve noget C#

using System;
using System.Net;
using System.Net.Sockets;

class UdpService
{
  public static void Main( string [] args )
  {
      // create a UDP socket
      UdpClient link = new UdpClient( Int32.Parse(args[0]) );
      Byte[] data = null;

      // note client address
      IPEndPoint RemoteIpEndPoint = new IPEndPoint( IPAddress.Any, 0 );

      // wait for data to arrive
      while( true )
      {
    // Slet forige input
    data = null;

        // string for ASCII version
        String strdata = String.Empty;

        // Hent beskeden
        data = link.Receive( ref RemoteIpEndPoint );

        // konverter til enstring
        strdata = System.Text.Encoding.ASCII.GetString(
                data, 0, data.Length);

        // Konverter til bytes for sending
        data = System.Text.Encoding.ASCII.GetBytes(>>>Indsæt evt timestamp + ping answer <<<);

        // send  data (buffer, length, address)
        link.Send( data, data.Length, RemoteIpEndPoint );
      }
  }
}

using System;
using System.Net;
using System.Net.Sockets;

class UdpClient
{
  public static void Main( string [] args )
  {
      // En ny UDP client
      UdpClient link = new UdpClient( args[0], Int32.Parse(args[1]) );

   
      string message = ">>> DIN ECHO <<<<"
      while( message.Length > 0 )
      {
        // convert til bytes før sending
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

        // send the data (buffer, length)
        link.Send( data, data.Length );

        // Klargør til svar
    IPEndPoint RemoteIpEndPoint = new IPEndPoint( IPAddress.Any, 0 );

        // string for ASCII version
        String responseData = String.Empty;

        // Hent svaret
    data = link.Receive( ref RemoteIpEndPoint );

        // Konverter tilbage til string
        responseData = System.Text.Encoding.ASCII.GetString(data, 0, data.Length);
        Console.WriteLine("Received: {0}", responseData);
    // Returner her tilbage
   
      }

      link.Close();
  }

Jeg ved godt at koden ikke er lige det du skal bruge, men håber du kan bruge det alligevel.
Avatar billede preben.m Nybegynder
30. juli 2006 - 23:19 #8
Jeg har gjort hvad jeg kunne, Arne kunne sikkert have lavet det bedre ;)

Jeg syntes bare det spørgsmål var så spændende, så jeg måtte bare svare, specielt da jeg engang har lavet noget der fungere på samme princip...

Hvad skal du egentlig bruge det til ??
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