我目前正在学习使用 unix 域套接字编程,对此我有疑问。分离消息的标准方法是什么?例如,服务器写入两条消息,客户端需要执行两次读取以获取消息。我想我可以通过总是在每条消息的末尾附加一个特定的字符序列来“定义”我自己的协议,但这似乎不正确。写入套接字时,null char 似乎被丢弃了。我将非常感谢您的澄清,尤其是在接下来的 2 小时内:D。
问问题
1568 次
2 回答
3
使用SOCK_DGRAM
套接字,您将在来自源的写入和在目标的读取之间获得一一对应的关系。
SOCK_STREAM
您确实需要在套接字提供的流之上的应用程序级协议。通常的选择是:
- 固定长度的消息,直到你得到足够的字节,
- 每条消息的固定长度的小标题,它告诉长度,可能是后面的类型,
- 分隔消息(这里的缺点是分隔符不能出现在消息本身中),
- 自描述格式(xml、asn.1 等)
于 2012-12-17T20:43:17.787 回答
2
首先,“unix sockets”通常是指“unix domain socket”,IPC的一种特殊形式。
写入套接字时,null char 似乎被丢弃了
这不太可能。你可能写的不对。
但这似乎不对
一种更简单的方法是在每个“消息”之前加上一个包含长度的标题。例如
+---+---------+---+-------+
| 3 | | 5 | ... |
+---+---------+---+-------+
一种更简单的方法是使用具有消息概念的协议,即类似于 UDP 或 SCTP 的协议,其中 asend
最多等于一个recv
。
于 2012-12-17T20:41:17.520 回答