告诉客户端什么时候写入缓冲区

时间:2012-10-06 13:39:47

标签: c sockets

我有一个简单的套接字服务器,它应该接收一个字符串并返回另一个字符串。 收到的字符串是多行的。 有没有办法告诉客户端何时完成发送而没有在末尾添加预定义的传输结束字符集?

2 个答案:

答案 0 :(得分:2)

您必须提前知道(1)消息的长度是什么,或者(2)消息的结束是什么。所以(1)为具有预期长度的消息添加前缀;或(2)所有消息的大小相同; (3)定义预先知道长度的不同消息类型;或(4)准确定义构成消息结束(以及可能的开头)的内容。

在您的情况下,连续两行换行可能会发出EOM信号。如果字符串中没有空字节,则为空字节。或者让客户端首先发送长度,然后发送消息。

答案 1 :(得分:1)

除了上述内容之外,您还可以定义一个小的固定大小的结构来用作协议消息头。正如wildplasser添加的那样,你应该注意endianness和尺寸。

如果您正在使用Berkeley套接字API,则应查看 htons()和htonl()以考虑可能不同的网络byte ordering。关于不同平台的整数大小,this thread可能很有用。

// NOTE: take care to know if you need to ensure constant MsgHeader size in bytes
// among platforms.
typedef _MsgHeader {
  int m_Type;
  int m_Length;
} MsgHeader;

每当通信的参与者希望发送字符串时,该参与者必须首先发送带有 sizeof(MsgHeader)的消息和接收者(在这种情况下是服务器),期待一条消息,只读 sizeof(MsgHeader)bytes ,将结果强制转换为 MsgHeader 并继续读取 m_Length字段,以找出字符串中需要的字节数那将被发送。

您还可以使用 m_Type字段来区分消息上下文,但如果现在不需要,只需在每封消息的开头发送长度即可。

您提到收到的字符串是多行的,所以我假设您的意思是它们全部由换行符分隔。如果是这样的话,您可以将发送者的字符串连接成一个更大的字符串,获取其长度并将其全部作为一个整体发送,假设没有一些特定于问题的方面可以防止这种情况发生。只是抬头,将接收缓冲区设置为零可能很有用,所以当你收到字符串时,它最后会有一个终止字符'\ 0',如果你没有在那里发送它消息。

希望有所帮助!