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
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
Synes godt om
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
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
Synes godt om
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!
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.
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;
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.
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 ??
Synes godt om
Ny brugerNybegynder
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.