[Haskell-cafe] network package and SIGVTALRM
Ruben Astudillo
ruben.astud at gmail.com
Wed Jul 13 10:14:32 UTC 2016
On 12/07/16 11:40, Andrey Sverdlichenko wrote:
> they both reading what other one sends to them? Given that your code only
> fails on large files, I guess sender never reads this 4-byte status
> messages receiver sends to it, and processes deadlock after socket buffer
> is filled up.
Right on the nail. I played a bit with tcpdump/wireshark to see I was
just sending 0 length ACKs and multiple 4 byte messages joined on a
single packet. Seems TCP buffers tiny packets using a strategy called
Nagle's algorithm and thus joined all my packets on a bufferzone until a
threeshold. Then it sent them all at once, making the other end crazy.
Adding on a function that set-ups the socket this line
newSocket :: AddrInfo -> IO Socket
newSocket addr = do
sock <- socket AF_INET Stream defaultProtocol
setSocketOption sock NoDelay 1 -- this was added
connect sock (addrAddress addr)
return sock
makes the downloads go until the end. :-)
> As a side node, consider using putWord32be from binary or cereal packages
> instead of serializing data yourself.
Note taken. I just don't want to impose on a new dependency on my first
patch. I did copy/pasted putWord32be (at least on style) for my int2BS
function though.
Thanks a lot!
-- Ruben Astudillo
More information about the Haskell-Cafe
mailing list