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
实际上:D
send
不发送包。除非您使用的是UDP,而您可能没有。注意TCP没有包。您可以发送24KB,然后recv将决定只接收16KB,然后在下次调用时接收其他8KB!现在我想发送一些元数据,并动态更改缓冲区的内存。非常感谢,我将查看您发送给图书馆的这些。这个答案主要是一堆与手头实际问题没有实际相关性的链接。@Asterostwithings:那么为什么它被接受了?@BasileStrynkevitch打败了我。@Asterostwithings:什么是“打败我”呢?顺便说一句,我是法国人。谁在伤害你?为什么?downvoter想留下一些建议吗?TCP
send()
永远不会返回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;
   }
}