I would try forking your sending thread, too, rather than using the main thread for sending. Alternatively, use the main thread for receiving and fork your sending thread.
–Kyle Marek-SpartzOn Sep 23, 2014, 10:14:09 AM, Ben Gunton <ben.gunton@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 packetslet receiveMulticast = do(msg, _) <- recvFrom recvSock 32628putStrLn . BS.unpack $ BS.take 100 msgreceiveMulticast_ <- forkIO receiveMulticast-- Send every line from a file as multicast messageinputFile <- openFile "data" ReadModefileLines <- BS.lines <$> BS.hGetContents inputFilelet sendMulticast msg = dosendTo sendSock msg addr-- Receiver FAILS to receive last few messages unless this-- thread delay exists... why?!-- threadDelay (1)mapM_ sendMulticast fileLineshClose inputFilethreadDelay (1000*1000*1000) -- Delay for 1000 seconds
- data, 71 KB- Main.hs, 2.2 KB_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe