我可以撥打receive {tcp, Socket, Bin} ->
電話嗎?例如,我有一個名爲Loop的頂級循環,它在接收到tcp數據時會調用一個函數parse_header來解析頭數據(一個整數,指示要遵循的數據類型以及它的大小),然後我需要接收整個有效載荷繼續前進。
當我需要一個完整的20字節並且想要在一個名爲parse_payload的單獨函數中調用receive時,我可能只會收到4個字節。因此,呼叫鏈看起來像loop->parse_header->parse_payload
,我希望parse_payload致電receive {tcp, Socket, Bin} ->
。
我不知道這是否可以,或者我是否完全搞砸了,只能在Loop函數中做到。有人能夠啓發我嗎?如果我被允許這樣做,我是否違反了某種最佳做法?應該/我可以爲TCP數據做嵌套接收嗎?
0
A
回答
2
也許你可以檢查「erlang編程」的示例代碼。 下載頁面爲Erlang Programming Source Code
在文件socket_examples.erl中,請檢查「receive_data」函數。對於perse消息,我認爲你應該確定如何逐個分離消息(固定長度或終止字節),然後解析消息的頭部和有效負載。
receive_data(Socket, SoFar) -> receive {tcp,Socket,Bin} -> %% (3) receive_data(Socket, [Bin|SoFar]); {tcp_closed,Socket} -> %% (4) list_to_binary(reverse(SoFar)) %% (5) end.
1
您還可以在被動模式下設置gen_tcp套接字。這樣,擁有進程將不會收到消息的輸入,但必須使用gen_tcp:recv(Socket,ByteCount)獲取它,它返回{ok,Input}或{error,Reason}。由於此方法無限期地等待使用gen_tcp:recv/3可能需要添加超時的字節。 (Erlang documentation of gen_tcp:recv)
雖然乍看之下,似乎這個過程現在已經完全無法對發送給它的信息作出反應,有以下解決方法改善這種情況有點:
f1(X) ->
receive
message1 ->
... do something ...,
f1(X);
message2 ->
... do something ...,
f1(X)
after 0 %timeout in ms
{ok, Input} = gen_tcp:recv(Socket, ByteCount, Timeout),
... do something ... % maybe call some times gen_tcp:recv again
f1(X)
end.
如果你不」 t在這裏爲gen_tcp:recv添加一個超時,其他進程可能會等待f1處理它們的消息。
相關問題
- 1. Boost從TCP套接字接收數據
- 2. 應該/我可以更改嵌套解析器上的數據嗎?
- 3. 我應該實現自己的TCP/IP套接字超時嗎?
- 4. C# - 定義公共嵌套類:我們應該這樣做嗎?
- 5. 我們應該嵌套goroutines嗎?
- 6. 如果我可以接收HL7 XML,我可以接收CCD嗎?
- 7. 我可以通過TCP java套接字發送@entity嗎?
- 8. DatagramPacket可以接收數據嗎?
- 9. epoll可以接收udp數據包嗎?
- 10. Spark可以直接將數據讀入嵌套的case類嗎?
- 11. MySQL Group By&Count ...我可以做一個嵌套分組嗎?
- 12. ActiveRecord嵌套SELECT - 我可以做到沒有手動SQL嗎?
- 13. JUnit:可以(應該)這樣做嗎?
- 14. 我應該使用while(true)從Socket接收數據嗎?
- 15. 我可以嵌套ng-include嗎?
- 16. 我可以並行嵌套::: parLapply()嗎?
- 17. 我可以在Mercurial中嵌套subrepos嗎?
- 18. 我可以用鼻子嵌套TestCases嗎?
- 19. 我可以嵌套模板嗎?
- 20. 我可以從.rdlc報告參數接收數據嗎?
- 21. 一次可以使用套接字發送和接收的最大數據大小?(TCP套接字)
- 22. SFML TCP數據包接收
- 23. DTO可以嵌套DTO嗎?
- 24. Swift可以嵌套嗎?
- 25. FORMSOF可以嵌套嗎?
- 26. TCP - 發送和接收TCP/IP數據
- 27. UnderscoreJS嵌套模板:我該怎麼做?
- 28. 我可以從CloudKit接收對應於CKQuery的記錄數嗎?
- 29. 我可以在StreamReader套接字C#上收到一個int嗎?
- 30. 我可以使用pcap庫來接收ipv6數據包嗎?