我如何告诉客户端等待,直到它接收到所有的数据
How can i tell the client to wait until it received all the data?
这是我的第一篇文章。我目前正在上一门网络课程,我被要求编写一个客户端程序,可以将imap.gmail.com:993上的所有电子邮件下载为文本文件。我被要求使用winsock和openssl编写这个程序。我能够连接到服务器并获取电子邮件。对于小数据的邮件,我接收起来没有问题。但是对于包含大量数据的电子邮件,例如base64解码的图像,我只能下载其中的一部分。
所以我的问题是我怎么能告诉客户端等待,直到它从服务器接收到所有的数据?
到目前为止我所做的是:
void fetchMail(SSL *sslConnection,int lowerLimit, int UpperLimit)
{
SYSTEMTIME lt;
ofstream outfile;
GetLocalTime(<);
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,表示实际读取了多少字节。您应该使用该返回值—不仅用于此问题,还用于错误处理。如果邮件数据比缓冲区长,则该函数将读取,直到缓冲区填满并返回其大小。您应该继续调用该函数,直到所有字节都被读取。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 将相机数据从服务器实时流式传输到客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- Java 客户端C++服务器数据发送/接收问题
- 如何从客户端在 gsoap C++ 的标头中传递非 xml 数据?
- 将数据发送到多个客户端 UDP 时不支持地址族
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 通过TCP将数据从C++客户端发送到JSON服务器
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- C++中从客户端到服务器的数据传输问题
- Qt TCP服务器不从客户端读取数据
- UDP 客户端(接收器)未按预期接收数据报
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)