2

これは私の最初の投稿です。私は現在、ネットワーキングのクラスを受講しており、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] = '\0';
    }
    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])\r\n");

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

   }
 }
4

1 に答える 1

1

まず、コードに関するいくつかのポイント:

  • strcpy、strcat、およびこれらすべての未チェックで安全でない C 関数を使用します。バッファ オーバーフローやその他の種類のエラーが簡単に発生する可能性があります。C++ 文字列、ベクトル、配列の使用を検討してください。
  • その関数では、さまざまなレベルの抽象化でさまざまなことを行います。AFAICS の 2 つの SSL_* 関数呼び出しのみが、実際にはそのメールの取得に関するものです。読みやすさを向上させるために、いくつかの機能を分割することを検討してください。

さて、あなたの問題: について少しグーグルするSSL_readと、実際に読み取られたバイト数を示す int が返されることがわかります。この戻り値は、この問題だけでなくエラー処理にも使用する必要があります。メール データがバッファよりも長い場合、関数はバッファがいっぱいになるまで読み取り、そのサイズを返します。すべてのバイトが読み取られるまで、関数を呼び出し続ける必要があります。

于 2013-05-27T06:02:33.377 に答える