- Код: Выделить всё
- 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. В Линуксе пока не пробовал.




 по-моему как раз кроссплатформенного способа нет, т.е. стандартными средствами fpc
  по-моему как раз кроссплатформенного способа нет, т.е. стандартными средствами fpc