[Haskell-cafe] Multicast receiver thread fails to receive last few messages

Ben Gunton ben.gunton at gmail.com
Tue Sep 23 18:26:49 UTC 2014


Indeed, this was the issue. Took Benno's advice and added a yield, and it
works as I hoped it would. Thanks!

On Tue, Sep 23, 2014 at 10:46 AM, Gregory Collins <greg at gregorycollins.net>
wrote:

> Since this is UDP, you may be overflowing your device queue. Linux
> helpfully won't return ENOBUFS in this case but will instead just drop the
> packet on the floor. The threadDelay fixes this by yielding the processor
> so that the consumer thread can dequeue packets.
>
> G
>
> On Tue, Sep 23, 2014 at 8:14 AM, Ben Gunton <ben.gunton at gmail.com> wrote:
>
>> I am trying to send multicast messages from one thread, and receive them
>> on another. The sending thread reads lines from a file and sends them.
>> However, the receiving thread does not receive all the messages - it seems
>> to miss the last 10 message or so. If I run other programs to listen for
>> the multicast message, they receive them fine. So I think the issue is
>> something to do with receiving, not sending. I keep the program alive with
>> a threadDelay, so it shouldn't be halting prematurely. If I add a small
>> delay after each send, it works fine. And if I make the input file smaller,
>> it works fine.
>>
>> On the provided data file, on my system (64-bit Ubuntu, GHC 7.8.2), the
>> receiver fails to receive lines 125-140. Compiled with no optimizations.
>>
>> Thanks for any help!
>>
>> The relevant code snippets are below, and the sample data file and full
>> program are attached.
>>
>>     -- Loop to receive all the packets
>>     let receiveMulticast = do
>>             (msg, _) <- recvFrom recvSock 32628
>>             putStrLn . BS.unpack $ BS.take 100 msg
>>             receiveMulticast
>>     _ <- forkIO receiveMulticast
>>
>>     -- Send every line from a file as multicast message
>>     inputFile <- openFile "data" ReadMode
>>     fileLines <- BS.lines <$> BS.hGetContents inputFile
>>     let sendMulticast msg = do
>>             sendTo sendSock msg addr
>>             -- Receiver FAILS to receive last few messages unless this
>>             -- thread delay exists... why?!
>>             -- threadDelay (1)
>>     mapM_ sendMulticast fileLines
>>     hClose inputFile
>>
>>     threadDelay (1000*1000*1000) -- Delay for 1000 seconds
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>
>
> --
> Gregory Collins <greg at gregorycollins.net>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140923/1872d1fa/attachment.html>


More information about the Haskell-Cafe mailing list