2012-06-20 27 views
3

有沒有什麼辦法從Erlang的套接字中讀取整行,還是我需要在gen_tcp:recv之上手動實現行緩衝?Erlang gen_tcp和行I/O

+1

我認爲這將有助於 - http://stackoverflow.com/questions/5081298/erlang-get-tcprecv-data-length – 0xAX

回答

5

您是否嘗試過使用

inet:setopts(Socket, [{packet, line}]) 

參見:http://www.erlang.org/doc/man/inet.html#setopts-2

乾杯!

+0

如果您只需要一行,我還會在這些選項中說{active,once}。但是,如果你不想管理自己的緩衝區,這是一個很好的方法。 – archaelus

+0

@archaelus uhmm ... with {active,once}你不會調用gen_tcp:recv,但會收到這些行作爲消息..在這種情況下,inet:setopts/2適用於兩種情況(每次調用gen_tcp:recv都會返回1行),但使用{active,once}與設置{packet,line}或其他方式無關,只需要如何從套接字讀取(獲取)該行 – marcelog

+0

是的,{packet,line}似乎正在工作。 – taw

1

沒有必要自己實現行緩衝。

gen_tcp:listen/2接受{packet, line}Options的說法,這將使插座進入行模式,因此調用gen_tcp:recv將阻塞,直到一個完整的線已被讀取。

gen_tcp:listen(Port, [{packet, line}]) 

確保您的緩衝區的大小通過{buffer, Size}選項設置爲相同的呼叫(或inet:setopts/2)是足夠大,它會適合所有的線,否則會被截斷。

或者,如果使用藥劑,這應該讓你開始:

:gen_tcp.listen(port, [packet: :line, buffer: 1024])