0

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

4

2 回答 2

2

您必须提前知道(1)消息的长度是多少或(2)什么构成消息的结尾。因此,要么(1)为消息添加预期长度的前缀;或 (2) 使所有消息的大小相同;(3) 定义不同的消息类型,其中长度是预先知道的;或 (4) 准确定义什么构成消息的结尾(也可能是开头)。

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

于 2012-10-06T13:49:48.957 回答
1

除了所说的之外,您也许可以定义一个小的固定大小的结构来用作协议消息头。正如 wildplasser 添加的那样,您应该注意字节顺序和大小。

如果您正在使用 Berkeley 套接字 API,您应该查看htons() 和 htonl()以说明可能不同的网络字节顺序。关于跨不同平台的整数大小,这个线程可能很有趣。

// 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',以防您没有在信息。

希望对您有所帮助!

于 2012-10-06T14:10:31.853 回答