www.pudn.com > pino3srv-src.zip > server.pas


unit server; 
 
interface 
 
uses Classes, WinSock; 
 
type TServer = class(TThread) 
      private 
       { Private-Deklarationen } 
       sockaddr:TSockAddr; 
      protected 
       procedure Execute; override; 
      public 
       AdminServer:Boolean; 
       Socket:TSocket; 
       constructor Create(Port:Word;BindTo:string;AdminServer:Boolean); 
       procedure Shutdown; 
     end; 
 
var LastError:Integer; 
 
implementation 
 
{ Wichtig: Methoden und Eigenschaften eines Objekts in der VCL 
           können nur in einem Methodenaufruf mit SYNCHRONIZE 
           genutzt werden, z.B. 
 
      Synchronize(UpdateCaption); 
 
  und UpdateCaption könnte sein, 
 
    procedure TServer.UpdateCaption; 
    begin 
      Form1.Caption := 'Updated in einem Thread'; 
    end; } 
 
{ TServer } 
 
uses SysUtils, misc, abstuser, actuser, admuser; 
 
constructor TServer.Create(Port:Word;BindTo:string;AdminServer:Boolean); 
  begin 
    FreeOnTerminate:=true; 
    Priority:=tpLower; 
 
    Socket:=WinSock.socket(PF_INET,SOCK_STREAM,0); 
    if Socket=INVALID_SOCKET then 
      begin 
        LastError:=WSAGetLastError; 
        Abort; 
      end; 
 
    sockaddr.sin_family:=AF_INET; 
    sockaddr.sin_port:=htons(Port); 
    sockaddr.sin_addr.S_addr:=INADDR_ANY; 
    if BindTo<>'*' then sockaddr.sin_addr.S_addr:=inet_addr(PChar(BindTo)); 
 
    if bind(Socket,sockaddr,sosa)=SOCKET_ERROR then 
      begin 
        LastError:=WSAGetLastError; 
        Abort; 
      end; 
 
    if listen(Socket,5)=SOCKET_ERROR then 
      begin 
        LastError:=WSAGetLastError; 
        Abort; 
      end; 
 
    self.AdminServer:=AdminServer; 
 
    inherited Create(false); 
  end; 
 
procedure TServer.Execute; 
var newuser:TUser;Typ:string; 
  begin 
    { Plazieren Sie den Thread code hier } 
//    if AdminServer then Typ:='[Administration Server]' else Typ:='[Chat Server]'; 
//    Writeln(Typ,' Trying to start the server.'); 
 
    if AdminServer=false then MakeSystemRooms; 
 
//    Writeln(Typ,' Server is listening on port ',ListenOnPort); 
    repeat 
      if AdminServer=false then newuser:=TActUser.Create else newuser:=TAdmUser.Create; 
      newuser.Socket:=accept(Socket,sockaddr,sosa); 
      newuser.IP:=sockaddr.sin_addr; 
      if newuser.Socket=INVALID_SOCKET then 
        begin 
          if Terminated=false then Writeln('An error occured while accepting a connection (Code ',WSAGetLastError,').'); 
          newuser.Free; 
        end else newuser.Resume; 
    until Terminated; 
    Writeln('Server has been shutdown'); 
  end; 
 
procedure TServer.Shutdown; 
  begin 
    Terminate; 
    CloseSock(Socket); 
  end; 
 
end.