Pełny kod programu (http://4programmers.net/Delphi/Gotowce/Simple_Chat_Server) podczas kompilacji sprawia ze Delphi odmawia posłuszeństwa i nie chce skompilować programu (lub chce a nie może :| )
Przy kompilacji (tworzy się plik exe o rozmiarze 19 kb):
Klikając na RUN w Delphi gdy jest już stworzony plik exe:
Przy próbie odpalenia pliku exe z folderu:
O co chodzi? Z tego co pamiętam kiedyś skompilował mi się ten program bez problemów a teraz ... :|
Jeśli nie chce się wam klikać w link do artykułu to macie 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
send(Clnts[I], Buff[0], Size, 0);
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.');
Halt(0);
end;
if WSAStartUp(MAKEWORD(1,1), WSAData) <> 0 then begin
WriteLn('Blad Windows Sockets DLL.');
Halt(0);
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.');
Exit;
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();
Halt(0);
end.