- Код: Выделить всё
Program server;
{$mode Delphi}
{$SMARTLINK ON}
{$LONGSTRINGS ON}
uses Sockets, SysUtils;
const
ServerPort = 4589;
function sfunc(sock: pointer): LongInt;
var
buf : string;
sin, sout: Text;
begin
writeln('Convert sock 2 text');
Sock2Text(LongInt(sock), sin, sout);
writeln('reset sin');
Reset(sin);
Writeln('rewrite sout');
Rewrite(sout);
writeln('Files opened');
buf := '';
repeat
writeln('Check input');
while not eof(sin) do
begin
writeln('Try ot read from socket');
Readln(sin, buf); //******************ЗДЕСЬ ОШИБКА
writeln('Check red data');
if buf <> '' then
begin
writeln('Try to answer');
Writeln(sout, '200 OK');
writeln('Answered');
writeln(buf);
end
end;
write(#13#10'- Step -'#13#10);
Sleep(100);
until buf = 'quit';
Close(sin);
Close(sout);
CloseSocket(LongInt(sock));
Writeln(#13#10'Connection closed');
Result := 0;
end;
function ConnectionsManager: Longint;
var
MainSocket, ClientSocket: Longint;
sAddrSize : LongInt;
sAddr : TINetSockAddr;
begin
ConnectionsManager := 0;
writeln('Try to start connection manager');
MainSocket := Socket(AF_INET, SOCK_STREAM, 0);
if MainSocket = -1 then
begin
writeln('Error: Socket(AF_INET, SOCK_STREAM, 0)');
halt(1);
end;
sAddr.Family := AF_INET;
sAddr.Port := htons(ServerPort);
sAddr.Addr := LongWord(StrToNetAddr('127.0.0.1'));
if not Bind(MainSocket, sAddr, SizeOf(sAddr)) then
begin
writeln('Error: Bind(MainSocket, sAddr, SizeOf(sAddr))');
halt(1);
end;
if not Listen(MainSocket, 2) then
begin
writeln('Error: Listen(MainSocket, x)');
halt(1);
end;
repeat
sAddrSize := SizeOf(sAddr);
writeln('Waiting for connection');
ClientSocket := Accept(MainSocket, sAddr, sAddrSize);
if ClientSocket <> -1 then
begin
writeln('Connection!');
BeginThread(@sfunc, pointer(ClientSocket));
end;
until false;
Shutdown(MainSocket, 2);
writeln('Close connection');
end;
Begin
ConnectionsManager;
end.
Запускаю этот сервер, потом подключаюсь клиентом. В консоли следующее:
- Код: Выделить всё
E:\My Projects\fpc\cross-sock>server
Try to start connection manager
Waiting for connection
Connection!
Waiting for connection
Convert sock 2 text
reset sin
rewrite sout
Files opened
Check input
Try ot read from socket
An unhandled exception occurred at $00403F2F :
EAccessViolation : Access violation
$00403F2F
$00402D1A
$00402508
$00405516
$77E802ED
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
Waiting for connection
E:\My Projects\fpc\cross-sock>
Из-за чего может быть такая ошибка и как ее исправить? Работаю в win32. В Линуксе пока не пробовал.