有没有什么方法可以检查C中缓冲区中写入了多少数据/字节



有什么方法可以检查缓冲区中当前写入的字节数吗?我想使用socket.send()动态设置通过套接字发送的数据量。现在我有问题了,假设我的文件是200KB,缓冲区设置为24KB,所以我需要发送9个包,我的输出文件是216KB大,而不是200KB作为输入。有什么方法可以处理这些空字节吗?

socket.send对我来说是未知的。我想你的意思是在某个套接字(7(上使用send(2(。

在许多情况下(想想一些tcp(7(流量通过几个Wifi路由器(,数据包可能是碎片化的。因此,一侧的给定send(2(可以对应于接收侧的多个recv(2(,反之亦然。

然后,您需要以某种方式管理您的数据包数据(例如,对发送的数据和接收的数据进行计数和缓冲(。在实践中,您需要一些关于它们的文档约定。HTTP、SMTP、JSONRPC、ONCRPC或MQTT可能是鼓舞人心的。

你会发现图书馆可能会有所帮助。例如libcurl、Wt、Qt、POCO、libonion。它们是开源的,所以你可以研究它们的源代码。

你也可以学习众所周知的开源服务器的源代码,如lighttpd、postfix等……或者从其他用C++编码的开源项目中获得灵感,包括Clang静态分析器、RefPerSys或fish或github或gitlab上的许多其他项目。

您将问题标记为CC++,但这两种语言非常不同。有关详细信息,请参阅此参考资料。

顺便说一句,Clang静态分析仪应该会有所帮助。如果您使用最新的GCC编译C++代码,请确保启用所有警告和调试信息,因此使用g++ -Wall -Wextra -g编译(稍后使用GDB调试器(

有什么方法可以检查在C 的缓冲区中写入了多少数据/字节吗

是的,因为发送(2(和写入(2((以及recv(2(与读取(2((都会在成功时返回字节计数。

您的事件循环将处理它们(计数字节、管理缓冲区(,并使用poll(2(或其他多路复用系统调用。在这种情况下,您可以找到有用的库(libev、libevent等(

还要注意,与2020年相比,我们到处都是UTF-8。因此,即使是文本输入,一些字母(如俄语的"É"或法语的"à"或你居住的城市波兹南的最后一个字母…(也可能需要超过一个字节。当您发送文本信息时,这会增加代码的复杂性。

最好的做法是自己统计这些字节,因为你总是知道自己在写多少字节。

如果你有200KB要发送,并且一次可以发送24KB,那么它只是(伪代码(:

const int chunkSize = 24*1024;
const int inputSize = 200*1024;
char input[inputSize];   // N.B. VLAs not actually valid C++; this is pseudo-code
int bytesSent = 0;
while (true)
{
const int bytesRemaining = inputSize - bytesSent;
const int bytesToSend = std::min(chunkSize, bytesRemaining);

if (bytesToSend == 0)
{
// Done!
break;
}

const int bytesWritten = send(&input[bytesSent], bytesToSend);

if (bytesWritten == 0)  // I'm assuming 0 written means error; adjust for your API
{
// Error! Handle it.
break;
}

bytesSent += bytesWritten;

if (bytesSent > inputSize)
{
// Something went horribly wrong
break;
}
}

简单😀.

(实际上,您可能应该使用一些无符号类型,如std::size_t,而不是int,除非您的send在出错时返回一些负值。(

bytesToSend是关键。您可能不想发送";"满";最后一次迭代中的chunk。这就是你额外的16KB的来源:你的输入并不是区块大小的精确倍数。

最新更新