gpt4 book ai didi

c++ - 我怎样才能告诉客户等到它收到所有数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:37 25 4
gpt4 key购买 nike

这是我的第一篇文章。我目前正在上网络类(class),我需要编写一个客户端程序,可以将 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();

}
}

最佳答案

首先关于您的代码的一些要点:

  • 您使用 strcpy、strcat 和所有那些未经检查的、不安全的 C 函数。您可能很容易遇到缓冲区溢出和其他类型的错误。考虑使用 C++ 字符串、 vector 、数组。
  • 您在该函数中在不同的抽象层次上做很多不同的事情。 AFAICS 只有两个 SSL_* 函数调用真的是关于获取该邮件的。考虑分解一些功能以提高可读性。

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

关于c++ - 我怎样才能告诉客户等到它收到所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com