TCP/IP Stream and recv?
Per Hedeland
hedeland@REDACTED
Wed Feb 8 20:11:24 CET 2006
Chris Campbell <cyberdanx@REDACTED> wrote:
>
>This may be a misunderstanding of tcp but here goes. The following
>client sends two messages to a client one after the other, then waits
>5 seconds and exits. The server waits for 1 second after accepting a
>connection, then does 1 call to recv. It only retrieves the first
>message. Is this Erlang specific or TCP behaviour? My understanding
>of tcp is that it's a stream and recv may return both messages
>(ignoring fragmentation for the moment).
Generally correct, but... - what did you think that "{packet, 4}" option
did?:-)
>I have only used tcp with single requests like HTTP so far. I'm now
>toying with something that will send messages back and forth hence why
>it's important to know if recv will pull a single message or it just
>pulls everything to make account for this in the protocol parser.
If you use one of the packet options, it will pull a single message -
that's what they do, implement "packet boundaries" on top of TCP. You
could easily do it yourself in the Erlang code (or any other language),
but it's a bit convenient to have the lower levels do it in some cases
(maybe a bit more efficient too).
If you don't use any of the packet options, it behaves just like TCP -
there are no messages, only a byte stream, and your recv could get
anything from 1 byte out of the first message to both messages complete.
--Per Hedeland
More information about the erlang-questions
mailing list