{
  Joachim Deckers
  Anlage zur 2. Staatsexamensarbeit / 28.5.96

  Lösungsvorschlag zur Aufgabe 12 im Abschnitt
  "7.3.5.6 Programmierung einer Client-Server-Anwendung auf dem Internet"

  Einfacher Finger Server für Turbo Pascal für Windows (ab Version 1.5).

  Eine WINSOCK.DLL muß zur Ausführung dieses Programmes installiert sein.
  Getestet habe ich es mit Trumpet Winsock Version 2.1f. 
}

program finger_server;

uses strings, wincrt, winsock,winprocs, wintypes, sockets;

{$I Winsockm.inc}            { Datei für Fensterbotschaftsbearbeitung einbinden }

var
  FingerPort   : Portnummer; { Portnummer des Finger-Services }
  Zeile, 
  ClientName,
  BenutzerName : String;     { Name des Benutzers }

  AcceptSocket,              { Socket für die eingehenden Verbindungen }
  FingerSocket : tSOCKET;    { Socket für den Finger-Service }

  RemoteAdresse: SocketAdresseIF;{ für Adresse des Clients }


procedure VerarbeiteEreignis(EreignisCode, FehlerCode, SocketNr: Word);
var AnzZeichen: Integer;
begin
  case EreignisCode of
    FD_ACCEPT: begin
                 writeln('Es versucht jemand, eine Verbindung aufzubauen.');
                 if FehlerCode<>0 then Fehler('USER_ACCEPT')
                 else begin
                   AcceptSocket:=AkzeptiereVerbindung(FingerSocket, RemoteAdresse);
                   Writeln('Verbindung wurde akzeptiert am Socket Nr. ',AcceptSocket);
                   { Als nächstes soll ggf. eine USER_READ Meldung ausgewertet werden
                     können, mit der der Client die Benutzerdaten auslesen will }
                   WSAAsyncSelect(AcceptSocket, hCRTWnd, USER_CONNECT, FD_READ);
                 end
               end;
    FD_READ  : begin
                 Writeln('Eine Nachricht wurde bereitgestellt.');
                 repeat
                   if EmpfangeText(AcceptSocket,Zeile) then Write(zeile);
                 until length(zeile)<255;
                 { Jetzt wird die Antwort an den Client geschickt }
                 zeile:='An diesem Rechner sitzt '+Benutzername+'!'+#13#10;
                 SendeText(AcceptSocket,zeile);
                 VerbindungAbbauen(AcceptSocket);
               end
  else
    StandardEreignisVerarbeitung(EreignisCode, FehlerCode, SocketNr)
  end
end;

procedure SocketEreignisPruefung;
var rc : integer;
begin
  rc := Listen(FingerSocket,5);     { Dem Socket soll "zugehört" werden }
                                    { bis zu 5 Clients dürfen in die Warteschlange }
  if rc <> 0 then Fehler('Listen konnte nicht ausgeführt werden...');

  rc := WSAAsyncSelect(FingerSocket, hCRTWnd, USER_ACCEPT, FD_ACCEPT);
  { Bedeutet: Gib eine USER_ACCEPT-Meldung an das aktuelle Fenster (hCRTWnd),
              falls ein Benutzer eine  Verbindung aufbauen will
              (also Winsock eine FD_ACCEPT Meldung sendet)}

  if rc <> 0 then begin
    VerbindungAbbauen(FingerSocket);
    Abbruch('WSAAsyncSelect ist fehlgeschlagen...');
  end;
end;

begin
  InitialisiereWinsockFenster;
  InitialisiereWinsock;
  FingerPort:=SucheServicePortNummer('finger','tcp');
  FingerSocket:=ErzeugeSocket;
  BindeSocket(FingerSocket,FingerPort,RemoteAdresse);
  Write('Bitte Benutzernamen eingeben: ');
  Readln(BenutzerName);

  SocketEreignisPruefung;
  { Das Programm wird terminiert, aber solange das Fenster nicht
    geschlossen wird, wird die Ereignisverarbeitung weiterhin
    ausgeführt! }
end.
