📄 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鰊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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -