Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Packets sometimes get concatenated

Tags:

tcp

erlang

I'm trying to make a simple server/application in Erlang.
My server initialize a socket with gen_tcp:listen(Port, [list, {active, false}, {keepalive, true}, {nodelay, true}]) and the clients connect with gen_tcp:connect(Server, Port, [list, {active, true}, {keepalive, true}, {nodelay, true}]). Messages received from the server are tested by guards such as {tcp, _, [115, 58 | Data]}.

Problem is, packets sometimes get concatenated when sent or received and thus cause unexpected behaviors as the guards consider the next packet as part of the variable.

Is there a way to make sure every packet is sent as a single message to the receiving process?

like image 873
POSIX_ME_HARDER Avatar asked Jan 28 '12 22:01

POSIX_ME_HARDER


1 Answers

Plain TCP is a streaming protocol with no concept of packet boundaries (like Alnitak said).

Usually, you send messages in either UDP (which has limited per-packet size and can be received out of order) or TCP using a framed protocol.

Framed meaning you prefix each message with a size header (usualy 4 bytes) that indicates how long the message is.

In erlang, you can add {packet,4} to your socket options to get framed packet behavior on top of TCP.

assuming both sides (client/server) use {packet,4} then you will only get whole messages.

note: you won't see the size header, erlang will remove it from the message you see. So your example match at the top should still work just fine

like image 76
David Budworth Avatar answered Nov 07 '22 10:11

David Budworth