'recbuf' and the size of received data

Hakan Mattsson hakan@REDACTED
Mon Jun 25 17:44:47 CEST 2001


On Sun, 24 Jun 2001, Scott Lystig Fritchie wrote:

Scott> >>>>> "wb" == Willem Broekema <willem@REDACTED> writes:
Scott> 
Scott> wb> I have a problem receiving tcp packets with data larger than 1024
Scott> wb> bytes.
Scott> 
Scott> If you attempt to read N bytes from a TCP socket, you'll get at most N
Scott> bytes, but all other bets are off.  If the sender is transmitting in M
Scott> byte chunks, you may get M bytes when attempting to read N bytes
Scott> (assuming M < N), but you may not.  If you need message boundaries,
Scott> you need to use a different protocol (e.g. UDP) or you need to embed
Scott> those boundaries into the protocol you're using over TCP.

If you want to use TCP you may utilize the builtin Erlang emulator
support for TPKT (http://www.ietf.org/rfc/rfc1006.txt).

Open the socket with:

	gen_tcp:connect(Host, Port, [{packet, tpkt} | OtherOptions])

Add the TPKT header manually on the sending side:

	tpkt_send(Socket, MessageBody) when binary(MessageBody) ->
	    Len = size(MessageBody) + 4,
	    gen_tcp:send(Socket, [3, 0, ((Len) bsr 8) band 16#ff, (L) band 16#ff , MessageBody]).

On the receiving side, the Erlang emulator will automatically assemble
complete TPKT-packets before they are forwarded to the control
process, where you strip the header off with:

	handle_info({tcp, Socket, <<3:8, _:8, Len:16, MessageBody/binary>>}, State) ->
            decode_body(MessageBody, State)...

/Håkan

---
Håkan Mattsson
Ericsson
Computer Science Laboratory
http://www.ericsson.se/cslab/~hakan




More information about the erlang-questions mailing list