我目前正在學習使用unix域套接字進行編程,我對此有疑問。 什麼是分離消息的標準方式? 例如服務器寫入兩條消息,客戶端需要兩次讀取才能獲得消息。 我想我可以通過在每條消息的末尾添加一個特定的字符序列來「定義」我自己的協議,但這看起來不正確。 寫入套接字時,空字符似乎會被扔掉。 我會非常感謝一些澄清,特別是如果它在未來2小時內:D。用unix域套接字編寫單獨的消息
0
A
回答
2
首先,「unix套接字」通常指的是「unix域套接字」,這是IPC的一種特殊形式。
空字符似乎寫一個插座
這是不可能的時候能得到扔掉。你可能不會寫作正確。
但這看起來不正確
一個更簡單的方法是將每個之前用含有長度的報頭「的消息」。例如
+---+---------+---+-------+
| 3 | | 5 | ... |
+---+---------+---+-------+
一個更簡單的方法是使用具有消息的概念,即,像UDP或SCTP其中send
相當於至多一個recv
的協議。
3
使用SOCK_DGRAM
套接字,您可以在來源和寫入目標之間獲得一對一的對應關係。
隨着SOCK_STREAM
你確實需要你的應用程序級協議在套接字提供的流頂部。通常的選擇是:
- 固定長度的消息,只是讀,直到你得到足夠的字節,
- 小固定長度的頭的告訴長度,也許類型的接下來的每個消息,
- 分隔消息(這裏的缺點是,分隔符不能出現在消息本身),
- 自描述格式(XML,ASN.1等)
相關問題
- 1. Unix域套接字名
- 2. 使用Python xmlrpclib和unix域套接字?
- 3. C++ boost unix域套接字使用send_to
- 4. Unix域套接字,Udp套接字Objective C使用什麼?
- 5. Go net/http unix域套接字連接
- 6. Linux上的unix域套接字?
- 7. 阻止unix域套接字的問題
- 8. UNIX域套接字的藥劑
- 9. PostgreSQL UNIX域套接字與TCP套接字
- 10. C++ Unix域套接字工具包
- 11. unix域套接字有多可靠?
- 12. Postgresql和django - Unix域套接字
- 13. UNIX域套接字在Java中
- 14. sendto失敗UNIX域套接字
- 15. Unix域套接字和選擇
- 16. ZeroMQ IPC Unix域套接字數控
- 17. 數據報Unix域套接字與Boost.Asio
- 18. UNIX域套接字和可可
- 19. Unix域套接字輔助數據
- 20. unix域套接字tcp_nodelay設置
- 21. Unix域套接字:使延遲恆定
- 22. Unix域套接字防火牆
- 23. 阿帕奇mod_proxy_uwsgi和UNIX域套接字
- 24. Warp:綁定到Unix域套接字
- 25. 如何在Pharo中讀取和寫入Unix域套接字?
- 26. NodeJs錯誤:寫入EPIPE http unix套接字域LXD API
- 27. C Unix套接字編程,確保讀/寫字節數?
- 28. 網絡套接字消息
- 29. PHP套接字消息null
- 30. 簡單的unix域套接字服務器
如果你正在編寫服務器和客戶端程序,你就知道該期待什麼。因此,您可以爲每條消息執行一次write()/ read()事務。 – Asblarf
情況是,我有一臺服務器和2個玩tic tac toe的客戶端。他們要麼獲得「輪到你」的信息,要麼成爲「遊戲結束」信息,要麼從對手中移出。我知道有幾種解決方法(使用期望值,確認每個事務tcp樣式等),兩個從服務器連續發送兩條消息,但我覺得他們是解決方法,我只是想知道是否有標準分離消息的方式。 – benehsv
@asblarf你正在談論數據報套接字。只是爲了讓OP清楚,它沒有機會使用流套接字。 –