Hi Leute,
ich wollte über die TUdpSocket Komponente eine Server Server Kommunikation implementieren, dabei soll sie ein Server, in dessen OnCreate, an alle Hosts ein Udp-Paket senden. Läuft dort eine Instanz der Applikation (gleicher Server) schon, soll dieser den Paketsender in eine Liste aufnehmen. Wird ein Server heruntergefahren meldet er sich bei allen Hosts ab (wird aus liste gelöscht). Das ist zumindest der Grundgedanke bzw. Zielsetzung. Leider funktionierts nicht das WaitforData schlägt fehl und wenn ichs weglasse sendet er zwar, bekommt aber ein ICMP Anwort mit der Message 'destination unreachable'. Ich habe zuvor nur mal ne Kleinigkeit mit den TClientSocket und TServerSockets gemacht, bei dieser TUdpSocket gibts keine Differenzierung zwischen Server und Client (gibt nur eine Komponente). Ich könnte zwar jetzt auf die anderen umsteigen, würde dies aber lieber mittels UDP erledigen (im Grunde ist die Sache ja recht trivial).
Sinn falls ihr einen braucht liegt ganz einfach darin, das meine Server bei Überlastung auf andere ausweichen sollen (insofern welche vorhanden, deswegen dieses Verfahren).
Ich hab jetzt auch schon ein paar Sachen ausprobiert (Host IP oder PC-Name, Sendln, Sendto ...), weiß net was ich falsch mache, dank euch für eure Hilfe
hier mal meine Proceduren:
(spielt sich im LAN ab)
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: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| procedure TfrmServer.AnmeldenImLAN; var i : integer; a : TSockAddr; b : String[255]; begin b := '1'+UDP_Socket.LocalHostName; UDP_Socket.RemotePort := UDP_RECEIVE_PORT; for i:=0 to LAN.Count-1 do begin if not(pchar(@(LAN.Items[i] as TObjNetResource).Info.lpRemoteName[2]) = GetPCName) then begin UDP_Socket.RemoteHost := pchar(@(LAN.Items[i] as TObjNetResource).Info.lpRemoteName[2]); UDP_Socket.Open; if UDP_Socket.Active then try if UDP_Socket.WaitForData(3000) then UDP_Socket.Sendln(b,#10); except end; end; end; UDP_Socket.LocalPort := UDP_RECEIVE_PORT; end;
procedure TfrmServer.AbmeldenImLAN; var i: integer; a: TSockAddr; b: String[255]; begin b := '0'+UDP_Socket.LocalHostName; for i:=0 to LAN.Count-1 do begin if not(pchar(@(LAN.Items[i] as TObjNetResource).Info.lpRemoteName[2]) = GetPCName) then begin UDP_Socket.RemoteHost := pchar(@(LAN.Items[i] as TObjNetResource).Info.lpRemoteName[2]); UDP_Socket.Open; if UDP_Socket.Active then try if UDP_Socket.WaitForData(3000) then UDP_Socket.Sendln(b,#10); except end; end; end; UDP_Socket.Active := false; end;
procedure TfrmServer.UDP_SocketReceive(Sender: TObject; Buf: PChar; var DataLen: Integer); begin case Buf[0] of '0' : if ServerLog.IndexOf(buf) <> -1 then ServerLog.Delete(ServerLog.IndexOf(buf)); '1' : if ServerLog.IndexOf(buf) = -1 then ServerLog.Add(buf); end; end;
|