【发布时间】:2015-02-21 19:02:19
【问题描述】:
我正在使用 C++ 中的 Winsock 开发一个应用程序。我有一个 200 字节长度的 char 数组,用于通过套接字发送字符串。
我的问题是发送大于 char 数组的消息时,所以我决定将它们分成多个块发送,但我不知道该怎么做。
为了发送和接收数据,我使用常规的send() 和recv() 函数:
recv(client, buffer, 200, NULL);
send(client, buffer, 200, NULL);
更新
我有一个结构:
struct Pack
{
unsigned int senderId;
char str[200];
}
在发送之前,我将 struct 转换为 char 数组。
Pack pk;
strcpy_s(pk.str, 200, "Some text to send.\0");
pk.senderId = 1 // user id
char *buffer = (char*)pk;
如果字符串大小大于 200,则 strcpy_s() 会崩溃。
【问题讨论】:
-
除了下面答案中描述的分块机制之外,接收端还需要知道消息的长度,以便它知道何时获得了将要发送的所有数据。这就是你需要设计协议的地方——接收方如何知道数据何时全部到达。一种常见的技术是使用 TLV(类型、长度、值)编码,其中消息包含类型指示符(如果一切都是字符串,则可选),然后是数据的长度,然后是那么多字节的数据。跨度>
-
如果我是你,我会使用 ZeroMQ 来传输任意大小的数据包(称为“消息”),而不管底层传输机制如何。以这种方式设置和获得可靠的网络要容易得多。
-
请注意,
strcpy_s()设计为在源字符串长于目标字符串时失败。当您传输数据时,您可能正在处理字节数组而不是字符串。您可能不会通过网络发送终止的空值,但接收方需要将数据组装成以空值终止的字符串。