有沒有什麼辦法從Erlang的套接字中讀取整行,還是我需要在gen_tcp:recv
之上手動實現行緩衝?Erlang gen_tcp和行I/O
回答
您是否嘗試過使用
inet:setopts(Socket, [{packet, line}])
參見:http://www.erlang.org/doc/man/inet.html#setopts-2
乾杯!
如果您只需要一行,我還會在這些選項中說{active,once}。但是,如果你不想管理自己的緩衝區,這是一個很好的方法。 – archaelus
@archaelus uhmm ... with {active,once}你不會調用gen_tcp:recv,但會收到這些行作爲消息..在這種情況下,inet:setopts/2適用於兩種情況(每次調用gen_tcp:recv都會返回1行),但使用{active,once}與設置{packet,line}或其他方式無關,只需要如何從套接字讀取(獲取)該行 – marcelog
是的,{packet,line}似乎正在工作。 – taw
沒有必要自己實現行緩衝。
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])
- 1. erlang gen_tcp發送問題
- 2. Erlang gen_tcp延遲發送
- 3. Erlang gen_tcp缺少數據包?
- 4. 調用gen_tcp發送IO錯誤
- 5. Erlang serial IO
- 6. 意外的io行爲:frelang在Erlang
- 7. Erlang io:格式緩衝和效率
- 8. Erlang gen_server eaddrnotavail在16358之後gen_tcp:連接調用
- 9. Erlang gen_tcp關閉通過GCDAsynchSocket得到錯誤的端口
- 10. 爲什麼gen_tcp沒有在erlang shell中定義?
- 11. 向Erlang的gen_tcp服務器發送大量消息
- 12. elixir中的IO列表效率/ erlang
- 13. erlang io:格式和一個掛起的web應用程序
- 14. 問題gen_tcp:接受
- 15. Erlang和C庫。並行執行
- 16. Perl的IO和Java IO
- 17. Erlang命令行
- 18. Erlang:如何知道哪個進程佔用網絡端口並執行IO
- 19. Erlang和Big Numbers
- 20. Erlang和WAVECOM
- 21. Erlang和記錄
- 22. Erlang和Toolchains
- 23. Erlang和Antlr
- 24. Erlang和進程
- 25. Erlang和websocket
- 26. json-rpc和erlang
- 27. Erlang編譯 - Erlang獨立執行
- 28. Erlang system_info和system_flag方法的行爲
- 29. TemplateHaskell和IO
- 30. Mysql和Nitrious IO
我認爲這將有助於 - http://stackoverflow.com/questions/5081298/erlang-get-tcprecv-data-length – 0xAX