[Haskell-cafe] Network Connect Timeouts

Chris Wong lambda.fairy at gmail.com
Sun Oct 15 00:17:10 UTC 2017


Hi Mark,

>From reading the source code for *runTCPClient* [1], it looks like a thin
wrapper around *getSocketFamilyTCP* and *close*.

It should be sufficient to copy that definition into your project and wrap
the *getSocketFamilyTCP* call in a *timeout*. You might need to import
*Data.Streaming.Network.Internal* to get access to the *AppData*
constructor.

Hope this helps!

[1]
https://hackage.haskell.org/package/streaming-commons-0.1.18/docs/src/Data-Streaming-Network.html#runTCPClient

On Sun, Oct 15, 2017 at 9:08 AM, Mark Fine <mark.fine at gmail.com> wrote:

> Hi Chris,
>
> In my application, I'm using *Data.Conduit.Network* from *conduit-extra* directly
> (*Data.Streaming.Network* from *streaming-commons* 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!
>
> Mark
>
> On Sat, Oct 14, 2017 at 3:09 AM, Chris Wong <lambda.fairy at gmail.com>
> wrote:
>
>> Hi Mark,
>>
>> What networking library are you using?
>>
>> There should be a lower level interface which allows for managing the
>> lifetime of a connection by hand.
>>
>> Chris
>>
>> On Oct 14, 2017 15:17, "Mark Fine" <mark.fine at gmail.com> wrote:
>>
>>> I'd like a configurable network connect timeout. Has anyone solved this
>>> reasonably?
>>>
>>> *System.Timeout.timeout* 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?
>>>
>>> As a workaround, I'm spinning trying to successfully connect first
>>> before trying to connect for real:
>>>
>>> -- | Try the TCP connection and see if you can connect...
>>> --
>>> tryTCPClient :: Int -> ClientSettings -> IO ()
>>> tryTCPClient microseconds settings = do
>>>   ok <- newIORef False
>>>   void $ timeout microseconds $ runTCPClient settings $ const $
>>>     writeIORef ok True
>>>   ok' <- readIORef ok
>>>   unless ok' $
>>>     tryTCPClient microseconds settings
>>>
>>> -- | Wrap runTCPClient with a connect timeout.
>>> --
>>> -- Tries the TCP connection first, and the runs the regular runTCPClient.
>>> -- Of course, this only enforces a TCP connect timeout on the first
>>> connect.
>>> -- The second TCP connect has no timeout :(
>>> --
>>> runTCPClient' :: Int -> ClientSettings -> (AppData -> IO a) -> IO a
>>> runTCPClient' microseconds settings action = do
>>>   tryTCPClient microseconds settings
>>>   runTCPClient settings action
>>>
>>> I've also tried running the *tryTCPClient* in its own thread
>>> concurrently with *runTCPClient* and throwing an exception if it can't
>>> connect in *microseconds*. None of these offer an actual true
>>> connection establishment timeout.
>>>
>>> Has anyone found a way to solve this? Thanks!
>>>
>>> Mark
>>>
>>>
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> To (un)subscribe, modify options or view archives go to:
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>>> Only members subscribed via the mailman list are allowed to post.
>>>
>>
>


-- 
Chris Wong (https://lambda.xyz)

"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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20171015/11ed2675/attachment.html>


More information about the Haskell-Cafe mailing list