使用unix域套接字编写单独的消息

时间:2012-12-17 20:36:31

标签: c sockets unix unix-socket

我目前正在学习使用unix域套接字进行编程,我对此有疑问。 分隔信息的标准方法是什么? 例如。服务器写入两条消息,客户端需要可以执行两次读取以获取消息。 我想我可以通过在每条消息的末尾附加一个特定的char序列来“定义”我自己的协议,但这似乎并不正确。 写入套接字时,null char似乎被抛弃了。 我会非常感激一些澄清,特别是如果它在接下来的两个小时内到来的话:D。

2 个答案:

答案 0 :(得分:3)

使用SOCK_DGRAM套接字,您将在源写入和目标读取之间获得一对一的对应关系。

使用SOCK_STREAM,您确实需要在套接字提供的流之上使用应用程序级协议。通常的选择是:

  • 固定长度的消息,只需阅读,直到您获得足够的字节数
  • 每条消息的
  • 固定长度标题,告知长度以及后面的类型,
  • 分隔邮件(这里的缺点是分隔符不能出现在邮件本身中),
  • 自我描述格式(xml,asn.1等)

答案 1 :(得分:2)

首先,“unix套接字”通常是指“unix域套接字”,这是一种特殊形式的IPC。

  

写入套接字

时,null char似乎被抛弃了

这不太可能。你的写作可能不对。

  

但这似乎不对

更简单的方法是在每个“消息”前面加上包含长度的标题。例如

         +---+---------+---+-------+
         | 3 |         | 5 | ...   |
         +---+---------+---+-------+

更简单的方法是使用具有消息概念的协议,即UDP或SCTP,其中send最多等于一个recv