Hi Scott,<br><br><br>Thanks - yeah you're right. I forgot to set the 'packet' property which results in Erlang handling any fragmentation and reassembling logical packets (application specific units of data) in the other end.<br>
<br><br>/Nicholas<br><br><div class="gmail_quote">2008/6/24 Scott Lystig Fritchie <<a href="mailto:fritchie@snookles.com">fritchie@snookles.com</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Nicholas, are you assuming that if you use:<br>
<br>
    %% Client side<br>
    Size0 = size(Bin),<br>
    gen_tcp:send(Socket, Bin),<br>
<br>
And:<br>
<br>
    %% Server side<br>
    {ok, Bin1} = gen_tcp:recv(ConnectedSocket, 0),<br>
    Size1 = size(Bin1),<br>
    %% or perhaps we're using active mode?<br>
    Size2 = receive<br>
                {tcp, ConnectedSocket, B} -> size(B)<br>
            end,<br>
<br>
... that Size0 is exactly equal to Size1 or Size2?  If yes, then you're<br>
mis-using TCP, because TCP communication is a pure byte steam and does<br>
not have a notion of message boundaries.  Any delays on the sender's<br>
side to try to keep hunks-of-the-stream's-bytes separate will eventually<br>
fail when the sender's load increases, or if the OS on either side feels<br>
like rebuffering, or when the network in the middle drops a packet and a<br>
retransmission juggles the receiver's buffering efforts, or ...<br>
<font color="#888888"><br>
-Scott<br>
</font></blockquote></div><br>