> Ask your OS vendor. These are OS errors. > But: > 11 is iirc EAGAIN, which means "try again", which is due to a potential > deadlock in the kernel not being handled properly.
You say that SocketErrors are OS errors but some influence the FPC compiler must have. I modified my program a bit. It now works with the 222 compiler. but still not with the 220 compiler. That is because I get a SocketError 104 from the 222 compiled program, when sending to a broken connection. The 220 compiled program aborts without any warning when sending to a broken connection. The FpRecv returns 0 when the connection is broken (and -1 when ok) when receive buffer is empty. I cannot find this behavior documented anywhere. So I am still locking for a reliable way to detect a broken connection. ----------------------------------------------------------- program tcp2ser; { A simple TCP program. } uses sockets, inetaux, myerror, sysutils; {System} const ListenPort : Word = 5000; MaxConn = 1; var lSock, uSock : LongInt; sAddr : TInetSockAddr; SocketError_,FpRecv_,Len : LongInt; c:char; WelcomeStranger:array[0..17] of char='Welcome, stranger!'; begin lSock := fpSocket(AF_INET,SOCK_STREAM,PF_UNSPEC); if lSock = -1 then SockError('Socket: '); with sAddr do begin Family := af_inet; Port := htons(ListenPort); Addr := 0; end; if fpBind(lSock, @sAddr, sizeof(sAddr))<0 then SockError('Bind: '); if fpListen(lSock, MaxConn)<0 then SockError('Listen: '); repeat Say('Waiting for connections...'); Len := sizeof(sAddr); uSock := fpAccept(lSock, @sAddr, @Len); if uSock = -1 then SockError('Accept: '); Say('Accepted connection from ' + AddrToStr(sAddr.Addr)); fpSend(uSock,@WelcomeStranger,18,MSG_DONTWAIT); repeat FpRecv_:=FpRecv(uSock,@c,1,MSG_DONTWAIT); while FpRecv_>0 do begin Writeln('-',c); FpRecv_:=FpRecv(uSock,@c,1,MSG_DONTWAIT); end; sleep(1000); if c='s' then fpSend(uSock,@WelcomeStranger,18,MSG_DONTWAIT); SocketError_:=SocketError; Writeln('->',SocketError_,FpRecv_:10); until (c=chr(27)) or ((SocketError_<>0) and ((SocketError_<>11))) or (FpRecv_=0); FpShutdown(uSock, 2); Say('Connection closed.'); until False; end. Med venlig hilsen Carsten Bager BEAS A/S Brørupvænget 10 DK-7650 Bøvlingbjerg Tlf. : +45 9788 5222 Fax : +45 9788 5434 www.beas.dk _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal