<div dir="ltr">Hi Mark,<br><br>From reading the source code for <b>runTCPClient</b> [1], it looks like a thin wrapper around <b>getSocketFamilyTCP</b> and <b>close</b>.<br><br>It should be sufficient to copy that definition into your project and wrap the <b>getSocketFamilyTCP</b> call in a <b>timeout</b>. You might need to import <b>Data.Streaming.Network.Internal</b> to get access to the <b>AppData</b> constructor.<br><br>Hope this helps!<br><br>[1] <a href="https://hackage.haskell.org/package/streaming-commons-0.1.18/docs/src/Data-Streaming-Network.html#runTCPClient">https://hackage.haskell.org/package/streaming-commons-0.1.18/docs/src/Data-Streaming-Network.html#runTCPClient</a></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 15, 2017 at 9:08 AM, Mark Fine <span dir="ltr"><<a href="mailto:mark.fine@gmail.com" target="_blank">mark.fine@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Chris,<div><br></div><div>In my application, I'm using <b>Data.Conduit.Network</b> from <b>conduit-extra</b> directly (<b>Data.Streaming.Network</b> from <b>streaming-commons</b> indirectly). The timeout I'm interested in managing is the connection establishment timeout - how long does the connect call wait to establish a connection. I haven't been able to figure out how to control this outside of applying a non-conditional timeout to the connect call (which is a timeout on the lifetime of a connection, not a timeout on the establishment of a connection). Thanks!</div><div><br></div><div>Mark</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Oct 14, 2017 at 3:09 AM, Chris Wong <span dir="ltr"><<a href="mailto:lambda.fairy@gmail.com" target="_blank">lambda.fairy@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Hi Mark,<div dir="auto"><br></div><div dir="auto">What networking library are you using?</div><div dir="auto"><br></div><div dir="auto">There should be a lower level interface which allows for managing the lifetime of a connection by hand.</div><span class="m_7847504827972106060HOEnZb"><font color="#888888"><div dir="auto"><br></div><div dir="auto">Chris</div></font></span></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_7847504827972106060h5">On Oct 14, 2017 15:17, "Mark Fine" <<a href="mailto:mark.fine@gmail.com" target="_blank">mark.fine@gmail.com</a>> wrote:<br type="attribution"></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_7847504827972106060h5"><div dir="ltr">I'd like a configurable network connect timeout. Has anyone solved this reasonably?<div><br></div><div><b>System.Timeout.timeout</b> times out connections, but works on the granularity of the life of the connection. Is there a reasonable way to configure a timeout around just establishing the connection? Maybe something like a conditional timeout that enables an action to disable the timeout once it expires?<br></div><div><br></div><div>As a workaround, I'm spinning trying to successfully connect first before trying to connect for real:</div><div><br></div><div><div><font face="monospace, monospace">-- | Try the TCP connection and see if you can connect...</font></div><div><font face="monospace, monospace">--</font></div><div><font face="monospace, monospace">tryTCPClient :: Int -> ClientSettings -> IO ()</font></div><div><font face="monospace, monospace">tryTCPClient microseconds settings = do</font></div><div><font face="monospace, monospace">  ok <- newIORef False</font></div><div><font face="monospace, monospace">  void $ timeout microseconds $ runTCPClient settings $ const $</font></div><div><font face="monospace, monospace">    writeIORef ok True</font></div><div><font face="monospace, monospace">  ok' <- readIORef ok</font></div><div><font face="monospace, monospace">  unless ok' $</font></div><div><font face="monospace, monospace">    tryTCPClient microseconds settings</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- | Wrap runTCPClient with a connect timeout.</font></div><div><font face="monospace, monospace">--</font></div><div><font face="monospace, monospace">-- Tries the TCP connection first, and the runs the regular runTCPClient.</font></div><div><font face="monospace, monospace">-- Of course, this only enforces a TCP connect timeout on the first connect.</font></div><div><font face="monospace, monospace">-- The second TCP connect has no timeout :(</font></div><div><font face="monospace, monospace">--</font></div><div><font face="monospace, monospace">runTCPClient' :: Int -> ClientSettings -> (AppData -> IO a) -> IO a</font></div><div><font face="monospace, monospace">runTCPClient' microseconds settings action = do</font></div><div><font face="monospace, monospace">  tryTCPClient microseconds settings</font></div><div><font face="monospace, monospace">  runTCPClient settings action</font></div></div><div><br></div><div>I've also tried running the <b>tryTCPClient</b> in its own thread concurrently with <b>runTCPClient</b> and throwing an exception if it can't connect in <b>microseconds</b>. None of these offer an actual true connection establishment timeout.</div><div><br></div><div>Has anyone found a way to solve this? Thanks!</div><div><br></div><div>Mark</div><div><br></div><div><br></div></div>
<br></div></div><span>______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/haskell-caf<wbr>e</a><br>
Only members subscribed via the mailman list are allowed to post.<br></span></blockquote></div></div>
</blockquote></div><br></div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Chris Wong (<a href="https://lambda.xyz" target="_blank">https://lambda.xyz</a>)<br><br>"I had not the vaguest idea what this meant and when I could not remember the words, my tutor threw the book at my head, which did not stimulate my intellect in any way." -- Bertrand Russell</div>
</div>