有什么方法可以检查缓冲区中当前写入的字节数吗?我想使用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上的许多其他项目。
您将问题标记为C
和C++
,但这两种语言非常不同。有关详细信息,请参阅此参考资料。
顺便说一句,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的来源:你的输入并不是区块大小的精确倍数。