Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的指针+;-需要解释它是如何工作的吗_C++_Mfc - Fatal编程技术网

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 );