{  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.
