C++ C+中的指针+;-需要解释它是如何工作的吗
我不太明白这句话: //首先获取文件的大小C++ C+中的指针+;-需要解释它是如何工作的吗,c++,mfc,C++,Mfc,我不太明白这句话: //首先获取文件的大小 cbLeftToReceive = sizeof( dataLength ); do { BYTE* bp = (BYTE*)(&dataLength) + sizeof(dataLength) - cbLeftToReceive; cbBytesRet = sockClient.Receive( bp, cbLeftToReceive ); // test for errors and get out if the
cbLeftToReceive = sizeof( dataLength );
do
{
BYTE* bp = (BYTE*)(&dataLength) + sizeof(dataLength) - cbLeftToReceive;
cbBytesRet = sockClient.Receive( bp, cbLeftToReceive );
// test for errors and get out if they occurred
if ( cbBytesRet == SOCKET_ERROR || cbBytesRet == 0 )
{
int iErr = ::GetLastError();
TRACE( "GetFileFromRemoteSite returned
a socket error while getting file length\n"
"\tNumber of Bytes received (zero means connection was closed) = %d\n"
"\tGetLastError = %d\n", cbBytesRet, iErr );
/* you should handle the error here */
bRet = FALSE;
goto PreReturnCleanup;
}
// good data was retrieved, so accumulate
// it with already-received data
cbLeftToReceive -= cbBytesRet;
}
while ( cbLeftToReceive > 0 );
我想知道如何将文件大小设置为dataLength:)
此行:BYTE*bp=(BYTE*)(&dataLength)+sizeof(dataLength)-cbleftoreceive
bp是dataLength addr的字节指针,这对吗?但是+sizeof(dataLength)-cbleftoreceive是什么意思
我认为文件没有那么小:4个字节,只要一次接收,他们怎么能接收数据长度和数据?它是否先发送数据长度,然后再发送数据 他/她意味着他在缓冲区的开头留出int的大小,文件的大小将放在缓冲区的开头(稍后将从套接字读取)Oh。有趣的数组算法。这个想法是从最后开始数数,这样当你到了最后,你就知道你完成了。分片:
1.查找数据长度(字节*)(&dataLength)的地址
2.跳到dataLength的末尾+sizeof(dataLength)
3.按预期接收的字节数备份-cbLeftToReceive
这就是我们写入从网络中获取的字节的地方
当我们从网络中获取字节时,我们减少cbLeftToReceive(cbLeftToReceive-=cbBytesRet;
),并继续尝试接收字节,直到完成为止。因此,每次通过循环时,bp都指向需要写入下一个接收字节的位置()
编辑:
所以现在我们知道我们将得到多少字节,我们如何接收它们而不潜在地用大块数据填充所有RAM?我们得到一个缓冲区,反复填充,并在缓冲区不为空时将其刷新到磁盘。当仍有大量数据(多于一个缓冲区)需要接收时,我们会尝试接收()一个填充缓冲区。当缓冲区不足时,我们只请求到文件末尾
iiGet = (cbLeftToReceive<RECV_BUFFER_SIZE) ?
cbLeftToReceive : RECV_BUFFER_SIZE ;
iiRecd = sockClient.Receive( recdData, iiGet );
iiGet=(CBLeftToReceive您引用的代码中最令人担忧的部分是,这个发送方和接收方都假设长度可以容纳在一个int中。(我仍然记得当4GB文件大得难以想象时,我现在不这么认为。)谢谢Eric给出了非常清晰的答案,但是数据和数据长度如何,你能给我解释一下吗?
destFile.Write( recdData, iiRecd); // Write it
cbLeftToReceive -= iiRecd;
while ( cbLeftToReceive > 0 );