For connect, I wrote a unit that implements a connect timeout, see: http://sourceforge.net/p/pascalscada/code/HEAD/tree/trunk/src/scada/sockets_w32_w64.pas#l70
or http://sourceforge.net/p/pascalscada/code/HEAD/tree/trunk/src/scada/sockets_unix.pas#l48 If you want work in blocking mode after connect, do something like this: fsocket = {$IFDEF WINDOWS}Socket{$ELSE}fpSocket{$ENDIF}(PF_INET, SOCK_STREAM, IPPROTO_TCP) //set socket options. setblockingmode(fsocket,MODE_NONBLOCKING); if connect_with_timeout(focket,@channel,sizeof(channel),FTimeoutInMs)<>0 then begin //check errors end; setblockingmode(FSocket,MODE_BLOCKING); 2013/4/17 Rainer Stratmann <rainerstratm...@t-online.de>: > On Wednesday 17 April 2013 10:22:58 you wrote: >> I thought MSG_DONTWAIT is actually the flag to switch to nonblocking mode, >> isn't it? > May be. >> As a matter of fact, the fprecv() above would get a result of -1 >> and a sockterror of "Try Again", which is exactly the behavior of >> nonblocking read. > Yes it seems so. > > I do always separately switch to the nonblocking mode before. >> >> >> 2013/4/17 Rainer Stratmann <rainerstratm...@t-online.de> >> >> > On Wednesday 17 April 2013 09:17:09 you wrote: >> > > Will this be a CPU hog: >> > > >> > > t := Now; >> > > while fprecv(s, @buf, buf_len, MSG_DONTWAIT) < 0 do begin >> > > >> > > if Now - t > 0.00001 * timeout then Break; // approx. <timeout> >> > >> > seconds >> > >> > > end; >> > > >> > > Thanks >> > >> > I did not read the whole thread, but that you favorite blocking mode >> > (which I >> > don't use). >> > >> > For MSG_DONTWAIT as far I know you have to change to the nonblocking >> > mode. >> > >> > > 2013/4/16 Luca Olivetti <l...@ventoso.org> >> > > >> > > > Al 16/04/13 12:20, En/na Michael Schnell ha escrit: >> > > > > On 04/16/2013 11:26 AM, Xiangrong Fang wrote: >> > > > >> How can I set the connection and read/write timeout when using >> > >> > socket >> > >> > > > >> in free pascal? >> > > > > >> > > > > I seem to remember that synapse can do this. >> > > > >> > > > Only in svn and it does it this way >> > > > >> > > > if FConnectionTimeout > 0 then >> > > > begin >> > > > >> > > > // connect in non-blocking mode >> > > > b := NonBlockMode; >> > > > NonBlockMode := true; >> > > > SockCheck(synsock.Connect(FSocket, Sin)); >> > > > if (FLastError = WSAEINPROGRESS) OR (FLastError = WSAEWOULDBLOCK) >> > >> > then >> > >> > > > if not CanWrite(FConnectionTimeout) then >> > > > >> > > > FLastError := WSAETIMEDOUT; >> > > > >> > > > NonBlockMode := b; >> > > > >> > > > end >> > > > else >> > > > >> > > > SockCheck(synsock.Connect(FSocket, Sin)); >> > > > >> > > > NonBlockMode in turn uses fpIoCtl with the FIONBIO parameter, >> > > > WSAEINPROGRESS=EsysEINPROGRESS, WSAEWOULDBLOCK=EsysEWOULDBLOCK and >> > > > CanWrite does an fpSelect >> > > > >> > > > Bye >> > > > -- >> > > > Luca >> > > > >> > > > _______________________________________________ >> > > > fpc-pascal maillist - fpc-pascal@lists.freepascal.org >> > > > http://lists.freepascal.org/mailman/listinfo/fpc-pascal >> > >> > _______________________________________________ >> > fpc-pascal maillist - fpc-pascal@lists.freepascal.org >> > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ > fpc-pascal maillist - fpc-pascal@lists.freepascal.org > http://lists.freepascal.org/mailman/listinfo/fpc-pascal -- The best regards, Fabio Luis Girardi PascalSCADA Project http://sourceforge.net/projects/pascalscada http://www.pascalscada.com _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal