【问题标题】:Erlang gen_tcp and line i/oErlang gen_tcp 和行 i/o
【发布时间】:2026-01-21 03:15:01
【问题描述】:

有什么方法可以从 Erlang 中的套接字读取整行,还是我需要在 gen_tcp:recv 之上手动实现行缓冲?

【问题讨论】:

标签: erlang


【解决方案1】:

您是否尝试过使用

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

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

干杯!

【讨论】:

  • 如果您只想要一行,我还会在这些选项中说 {active, once}。但是,是的 - 如果您不想自己管理缓冲,这是一个好方法。
  • @archaelus uhmm...使用 {active, once} 您不会调用 gen_tcp:recv,而是将这些行作为消息接收。在这种情况下,inet:setopts/2 适用于两种情况(对 gen_tcp:recv 的每次调用都将返回 1 行),但使用 {active, once} 与设置 {packet, line} 或其他无关,只是与您希望如何从套接字读取(获取)该行无关跨度>
【解决方案2】:

不需要自己实现行缓冲。

gen_tcp:listen/2 接受 {packet, line} 作为其 Options 参数,这会将套接字置于行模式,因此对 gen_tcp:recv 的调用将阻塞,直到读取完整的行。

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

确保通过{buffer, Size} 选项为同一个调用(或inet:setopts/2)设置的缓冲区大小足够大,可以容纳所有行,否则它们将被截断。

或者,如果使用 Elixir,这应该可以帮助您入门:

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

【讨论】: