Witam. Ostatnio zrobiłem serwer pod pewien program, ale mam mały problem. Serwer jest zrobiony jako aplikacja konsolowa, ale chciałbym, aby był jako aplikacja graficzna. Czy jest jakiś sposób przerobienia go?
Oto kod:
program ChatServ;
{$APPTYPE CONSOLE}
uses
Windows,
WinSock;
type
PInteger = ^Integer;
var
I: Integer;
Tmp: DWord;
Port: Word;
Sock: TSocket;
PInt: PInteger;
WSAData: TWSAData;
AdrL, AdrR: TSockAddrIn;
Clnts: Array of TSocket;
procedure SockThread(Pint: PInteger); stdcall;
var
Size, I: Integer;
Buff: Array[0..1023] of Char;
begin
repeat
Size := recv(Clnts[PInt^], Buff[0], SizeOf(Buff), 0);
if Size < 1 then Break;
for I := 0 to Length(Clnts) -1 do
if Clnts[I] <> INVALID_SOCKET then begin
send(Clnts[I], Buff[0], Size, 0);
end
until False;
shutdown(Clnts[PInt^], SD_BOTH);
closesocket(Clnts[PInt^]);
Clnts[PInt^] := INVALID_SOCKET;
Dispose(PInt);
end;
function HandlerRoutine(CtrlType: DWord): Bool; stdcall;
var
I: Integer;
begin
closesocket(Sock);
for I := 0 to Length(Clnts) -1 do
if Clnts[I] <> INVALID_SOCKET then begin
shutdown(Clnts[I], SD_BOTH);
closesocket(Clnts[I]);
end;
Result := True;
end;
begin
Val(ParamStr(1), Port, Tmp);
if Port = 0 then begin
WriteLn('Nieprawidlowy port.');
WriteLn('Program uruchomiony na domyslnym porcie.');
Port:=1111;
end;
if WSAStartUp(MAKEWORD(1,1), WSAData) <> 0 then begin
WriteLn('Blad Windows Sockets DLL.');
end;
Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
AdrL.sin_family := AF_INET;
AdrL.sin_addr.S_addr := htonl(INADDR_ANY);
AdrL.sin_port := htons(Port);
bind(Sock, AdrL, SizeOf(AdrL));
if listen(Sock, 5) = SOCKET_ERROR then begin
WriteLn('Blad gniazda.');
end;
SetConsoleCtrlHandler(@HandlerRoutine, True);
WriteLn('Serwer uruchomiony na porcie ',Port,'...');
repeat
I := 0;
while I < Length(Clnts) do begin
if Clnts[I] = INVALID_SOCKET then Break;
Inc(I);
end;
if I = Length(Clnts) then SetLength(Clnts, I + 1);
Tmp := SizeOf(AdrR);
Clnts[I] := accept(Sock, @AdrR, @Tmp);
if Clnts[I] = INVALID_SOCKET then Break;
New(PInt);
PInt^ := I;
CreateThread(nil, 0, @SockThread, PInt, 0, Tmp);
until False;
WriteLn('Serwer zatrzymany.');
WSACleanUp();
end.