[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