gpt4 book ai didi

C++ 在通过 TCP 发送数据之前发送数据大小

转载 作者:可可西里 更新时间:2023-11-01 02:45:11 25 4
gpt4 key购买 nike

免责声明:我对此很陌生,所以我会尽可能清楚。

我有可变“数据包”大小的数据。我知道 TCP 是一种流式传输协议(protocol) - 它传输字节,而不是数据包。

现在,我想告诉我的客户要从流中读取的数据大小(这构成了我的“数据包”之一)。

我发送的数据是 std::string 格式

如果我的字符串名为 outstring,我如何用客户端需要读取的字符串大小填充 UINT8 buff[4]

我的客户端是用 C# 编写的,如下所示:

int total = 0;
int read;
byte[] datasize = new byte[4];

read = socket.Receive(datasize, 0, 4, 0);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];

while (total < size) {
read = socket.Receive(data, total, dataleft, 0);
if (read == 0) {
break;
}
total += read;
dataleft -= read;
}

最佳答案

抱歉,这不是您问题的直接答案,但它可能有用。

使用原始套接字编程很糟糕。要使程序稳健地处理它们,还有很多工作要做。例如,在您的代码片段中,您尝试将 4 个字节接收到 datasize。无法保证单个 socket.Receive() 操作实际上会读取 4 个字节,它可以读取 1 到 4 个字节之间的任何内容。您必须在循环中调用 socket.Receive(),直到收到所有 4 个字节,就像您稍后所做的那样。

幸运的是有类似 ZeroMQ 的东西这消除了几乎所有的痛苦,并为您提供了一个很好的简单消息传递框架,该框架位于套接字、管道、内存等之上。如果您只想完成某件事,强烈推荐它。

关于C++ 在通过 TCP 发送数据之前发送数据大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com