server.pas

来自「flash视频源码 flash视频源码」· PAS 代码 · 共 105 行

PAS
105
字号
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鰊nen nur in einem Methodenaufruf mit SYNCHRONIZE
           genutzt werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption k鰊nte 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.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?