C++ 在C语言中,有没有办法检查缓冲区中写入了多少数据/字节
有没有办法检查在某一时刻缓冲区中写入了多少字节?我想使用C++ 在C语言中,有没有办法检查缓冲区中写入了多少数据/字节,c++,linux,sockets,C++,Linux,Sockets,有没有办法检查在某一时刻缓冲区中写入了多少字节?我想使用socket.send()动态设置通过socket发送的数据量。现在我有问题了,假设我的文件是200KB,我的缓冲区设置为24KB,所以我需要发送9个包,我的输出文件是216KB,而不是200KB作为输入。有没有办法处理这些空字节?socket.send我不知道。我猜你的意思是用在一些东西上 在许多情况下(想想通过几个Wifi路由器的一些流量),数据包可能会丢失。因此,一方的给定值可能对应于接收方的多个值,反之亦然 然后,您需要以某种方式管
socket.send()
动态设置通过socket发送的数据量。现在我有问题了,假设我的文件是200KB,我的缓冲区设置为24KB,所以我需要发送9个包,我的输出文件是216KB,而不是200KB作为输入。有没有办法处理这些空字节?socket.send
我不知道。我猜你的意思是用在一些东西上
在许多情况下(想想通过几个Wifi路由器的一些流量),数据包可能会丢失。因此,一方的给定值可能对应于接收方的多个值,反之亦然
然后,您需要以某种方式管理数据包数据(例如,对发出的数据和接收的数据进行计数和缓冲)。在实践中,您需要一些关于它们的文档约定。或者可能是鼓舞人心的
你会发现图书馆对你很有帮助。例如。它们是开源的,所以您可以研究它们的源代码
您还可以学习著名的开源服务器的源代码,例如。。。或者从C++中的其他开源项目中获取灵感,包括OR或./P>上的或或其他许多开源项目。
您将问题标记为C
和C++
,但它们是非常不同的语言。更多信息,请参阅
顺便说一句,这本书应该很有帮助。如果您最近编译了C++代码,请确保启用所有警告和调试信息,因此使用<代码> G++-Walth-WOTU-G/<代码>编译(稍后使用调试器)
在C语言中,有没有办法检查缓冲区中写入了多少数据/字节
是的,因为and(和and)都返回一个字节计数
您将处理它们(计数字节、管理缓冲区)并使用或其他多路复用系统调用。在这种情况下,您可以找到有用的库(,等…)
也要比2020年更清楚。因此,即使是文本输入,某些字母(如俄语字母或法语字母或您居住的城市波兹南的最后一个字母…)也可能需要超过一个字节。当您发送文本信息时,这会增加代码的复杂性。最好的办法是自己记录这些字节的数量,因为您总是知道要写入多少字节 如果您有200KB要发送,并且一次可以发送24KB,那么它只是(伪代码):
我想这只是一个简单的数学CALC和循环。标准C++中没有套接字类,所以必须包含有关所使用的库的信息。你检查过你发送和接收的文件的字节大小了吗?这只是基本的数学,不是吗?记下你已经写了多少字节,你已经知道你总共要写多少字节,以及你一次可以写多少字节。。。所以这只是对std::max的调用。。否?或
std::min
实际上:Dsend
不发送包。除非您使用的是UDP,而您可能没有。注意TCP没有包。您可以发送24KB,然后recv将决定只接收16KB,然后在下次调用时接收其他8KB!现在我想发送一些元数据,并动态更改缓冲区的内存。非常感谢,我将查看您发送给图书馆的这些。这个答案主要是一堆与手头实际问题没有实际相关性的链接。@Asterostwithings:那么为什么它被接受了?@BasileStrynkevitch打败了我。@Asterostwithings:什么是“打败我”呢?顺便说一句,我是法国人。谁在伤害你?为什么?downvoter想留下一些建议吗?TCPsend()
永远不会返回0,失败时返回<0,接受的字节数返回>0。我还将while(true)
更改为while(bytesSent
,如果(bytesToSend==0),则去掉。另外,在所示的数学中,if(bytesSent>inputSize)
永远不会为真,所以也要去掉它:while(bytesSent
@RemyLebeau,这取决于您使用的API,如我所说。你说的是POSIX,我想这很好。如我所述,相应地调整逻辑。我更喜欢现在的条件。“if(bytesent>inputSize)
永远不会是真的”如果发生了可怕的错误,并且byteswrited
不是它应该是什么,这就是评论所说的,也是我们在这种情况下放弃(break
)的原因(即不要做出假设!)@RemyLebeau如果你愿意,你可以用自己的代码风格写自己的答案:)“如果发生了可怕的错误,会的”——你想象会发生什么?给定显示的代码,除非调用线程的堆栈内存被另一个线程、错误的驱动程序或硬件故障损坏,否则其他任何情况都不会导致bytesSent>inputSize
情况发生。
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;
}
}