OssClient 是用于管理存储空间(Bucket)和文件(Object)等 OSS 资源。使用 C++ SDK 发起 OSS 请求时,您需要初始化一个 OssClient 实例,并根据需要修改 ClientConfiguration 的默认配置项。

配置 OSSClient

ClientConfiguration 是 OSSClient 的配置类,您可通过此类来配置代理、连接超时、最大连接数等参数。可设置的参数如下:
参数 描述
userAgent 用户代理,指 HTTP 的 User-Agent 头。默认为 aliyun-sdk-cpp/1.X.X
maxConnections 连接池数。默认是 16 个
requestTimeoutMs 请求超时时间。超时没有收到数据会关闭连接,默认为 10000ms
connectTimeoutMs 建立连接的超时时间。默认为 5000ms
retryStrategy 自定义失败重试策略
proxyScheme 代理协议,默认为 HTTP
proxyPort 代理服务器端口
proxyPassword 代理服务器验证的密码
proxyUserName 代理服务器验证的用户名
verifySSL 是否开启 SSL 验证,默认关闭
enableCrc64 是否开启 CRC64 检查,默认开启
enableDateSkewAdjustment 是否开启 HTTP 请求时间自动修正,默认开启
sendRateLimiter 上传限速(单位 KB/s)
recvRateLimiter 下载限速(单位 KB/s)

设置超时时间

以下代码用于设置超时时间:
#include <alibabacloud/oss/OssClient.h>

using namespace AlibabaCloud::OSS;

int main(void)
{

    /* 初始化网络等资源 */
    InitializeSdk();
    ClientConfiguration conf;
  
    /* 设置连接池数,默认为16个 */
    conf.maxConnections = 20;
  
    /* 设置请求超时时间,超时没有收到数据就关闭连接,默认为10000ms */
    conf.requestTimeoutMs = 8000;
  
    /* 设置建立连接的超时时间,默认为5000ms */
    conf.connectTimeoutMs = 8000;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* 释放网络等资源 */
    ShutdownSdk();
    return 0;
}

设置限速处理

以下代码用于设置上传、下载限速:
#include <alibabacloud/oss/OssClient.h>
#include <alibabacloud/oss/client/RateLimiter.h>

using namespace AlibabaCloud::OSS;

class  UserRateLimiter : public RateLimiter
{
public:
    DefaultRateLimiter() :rate_(0) {};
    ~DefaultRateLimiter() {};
    virtual void setRate(int rate) { rate_ = rate; };
    virtual int Rate() const { return rate_; };
private:
    int rate_;
};

int main(void)
{
    /* 初始化OSS账号信息 */
    std::string AccessKeyId = "yourAccessKeyId";
    std::string AccessKeySecret = "yourAccessKeySecret";
    std::string Endpoint = "yourEndpoint";
    std::string BucketName = "yourBucketName";
    std::string ObjectName = "yourObjectName";
  
    /* 初始化网络等资源 */
    InitializeSdk();

    ClientConfiguration conf;
  
    auto sendrateLimiter = std::make_shared<UserRateLimiter>();
    auto recvrateLimiter = std::make_shared<UserRateLimiter>();
    conf.sendRateLimiter = sendrateLimiter;
    conf.recvRateLimiter = recvrateLimiter;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
  
    /* 设置下载限速(单位KB/s) */
    recvrateLimiter->setRate(256);
  
    /* 设置上传限速(单位KB/s) */
    sendrateLimiter->setRate(256);
  
    /* 上传文件 */
    auto outcome = client.PutObject(BucketName, ObjectName,"yourLocalFilename");  
  
    /*上传过程中更新上传限速(单位KB/s) */
    sendrateLimiter->setRate(300);
  
    /* 释放网络等资源 */
    ShutdownSdk();
    return 0;
}

设置重试策略

以下代码用于重试策略:
#include <alibabacloud/oss/OssClient.h>
#include <alibabacloud/oss/client/RetryStrategy.h>

using namespace AlibabaCloud::OSS;

class UserRetryStrategy : public RetryStrategy
{
public:

    /* maxRetries最多重试次数,scaleFactor重试等待时间的尺度因子 */
    DefaultRetryStrategy(long maxRetries = 3, long scaleFactor = 300) :
        m_scaleFactor(scaleFactor), m_maxRetries(maxRetries)  
    {}
    
    /* 用户可自定义shouldRetry函数,用于判断是否进行重试 */
    bool shouldRetry(const Error & error, long attemptedRetries) const;
    
    /* 用户可自定义calcDelayTimeMs函数,用于计算重试的延迟等待时间 */
    long calcDelayTimeMs(const Error & error, long attemptedRetries) const;
    
private:
    long m_scaleFactor;
    long m_maxRetries;
};

bool DefaultRetryStrategy::shouldRetry(const Error & error, long attemptedRetries) const
{    
    if (attemptedRetries >= m_maxRetries)
        return false;

    long responseCode = error.Status();

    //http code
    if ((responseCode == 403 && error.Message().find("RequestTimeTooSkewed")) ||
        (responseCode > 499 && responseCode < 599)) {
        return true;
    }
    else {
        switch (responseCode)
        {
        //curl error code
        case (ERROR_CURL_BASE + 7):  //CURLE_COULDNT_CONNECT
        case (ERROR_CURL_BASE + 18): //CURLE_PARTIAL_FILE
        case (ERROR_CURL_BASE + 23): //CURLE_WRITE_ERROR
        case (ERROR_CURL_BASE + 28): //CURLE_OPERATION_TIMEDOUT
        case (ERROR_CURL_BASE + 52): //CURLE_GOT_NOTHING
        case (ERROR_CURL_BASE + 55): //CURLE_SEND_ERROR
        case (ERROR_CURL_BASE + 56): //CURLE_RECV_ERROR
            return true;
        default:
            break;
        };
    }

    return false;
}

long DefaultRetryStrategy::calcDelayTimeMs(const Error & error, long attemptedRetries) const
{
    UNUSED_PARAM(error);
    return (1 << attemptedRetries) * m_scaleFactor;
}

int main(void)
{
    /* 初始化网络等资源 */
    InitializeSdk();

    ClientConfiguration conf;
 
    /* 设置失败请求重试次数,默认为3次 */
    auto defaultRetryStrategy = std::make_shared<UserRetryStrategy>(5);
    conf.retryStrategy = defaultRetryStrategy;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* 释放网络等资源 */
    ShutdownSdk();
    return 0;
}