Autor Beitrag
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 02.07.04 10:28 
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)
ausblenden volle Höhe Delphi-Quelltext
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
        //A := UDP_Socket.GetSocketAddr(UDP_Socket.RemoteHost,UDP_Socket.RemotePort);
        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
      //A := UDP_Socket.GetSocketAddr(UDP_Socket.RemoteHost,UDP_Socket.RemotePort); 
      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;

// -------------------------------------------------------------------------- //

_________________
mfg
Tana´Ri