我如何告诉客户端等待,直到它接收到所有的数据

How can i tell the client to wait until it received all the data?

本文关键字:数据 客户端 何告诉 等待      更新时间:2023-10-16

这是我的第一篇文章。我目前正在上一门网络课程,我被要求编写一个客户端程序,可以将imap.gmail.com:993上的所有电子邮件下载为文本文件。我被要求使用winsock和openssl编写这个程序。我能够连接到服务器并获取电子邮件。对于小数据的邮件,我接收起来没有问题。但是对于包含大量数据的电子邮件,例如base64解码的图像,我只能下载其中的一部分。

所以我的问题是我怎么能告诉客户端等待,直到它从服务器接收到所有的数据?

到目前为止我所做的是:

void fetchMail(SSL *sslConnection,int lowerLimit, int UpperLimit)
 {
     SYSTEMTIME lt;
    ofstream outfile;
     GetLocalTime(&lt);
    char szFile[MAX_PATH + 1];
    char szPath[MAX_PATH+1];
    char message[BUFSIZE];
    char result[BUFSIZE];
    ::GetModuleFileName( NULL, szPath,  MAX_PATH );
    // Change file name to current full path
  LPCTSTR psz = strchr( szPath, '');
    if( psz != NULL )
    {
        szPath[psz-szPath] = '';
    }
    char szMailBox[MAX_PATH+1];
    memset( szMailBox, 0, sizeof(szMailBox));
    wsprintf( szMailBox, "%s\inbox", szPath );
    // Create a folder to store emails
    ::CreateDirectory( szMailBox, NULL );
   for(int i = lowerLimit; i < UpperLimit; ++i)
   {
    // Create a folder to store emails
       memset( szFile, 0, sizeof(szFile));
       memset( result, 0, sizeof(result));
       memset( message, 0, sizeof(message));
       ::sprintf(szFile,"%s\%d%d%d%d%d%d.txt", szMailBox, lt.wHour, lt.wMinute,lt.wMinute,lt.wSecond, lt.wMilliseconds,i);

    string Result;//string which will contain the result
    stringstream convert; // stringstream used for the conversion
    const char * num;
    convert << i;//add the value of Number to the characters in the stream
    Result = convert.str();//set Result to the content of the stream
    num = Result.c_str();

    strcpy(result, "tag FETCH ");
    strcat(result,  num);
    strcat(result, " (BODY[TEXT])rn");
    int n = 0;
    cout << "nFETCHING : n";
    SSL_write(sslConnection, result, strlen(result));
    outfile.open(szFile );
    SSL_read(sslConnection, message, sizeof(message)-1);
    outfile <<message ;

    outfile.close();
   }
 }

首先你的代码中的一些要点:

    你使用strcpy, strcat和所有那些未检查的,不安全的C函数。您可能很容易得到缓冲区溢出和其他类型的错误。考虑使用c++字符串、向量、数组。
  • 在这个函数中,你在不同的抽象层次上做了很多不同的事情。afacs只有两个SSL_*函数调用真正是关于获取邮件的。考虑拆分一些函数来提高可读性。

现在你的问题:谷歌一下SSL_read,你会看到它返回一个int,表示实际读取了多少字节。您应该使用该返回值—不仅用于此问题,还用于错误处理。如果邮件数据比缓冲区长,则该函数将读取,直到缓冲区填满并返回其大小。您应该继续调用该函数,直到所有字节都被读取。