# 关闭会话（C++）

当一个远场通信请求完成，即数据已经成功发送并收到确认，或者在某些情况下，由于超时或其他错误原因，通信尝试失败，此时应立即调用相应的“关闭会话”或“释放资源”方法。这一操作的主要目的是：

*   释放资源：在通信过程中，系统会分配各种资源，包括内存、网络带宽、处理器时间等，以支持数据的发送和接收。一旦通信结束，这些资源应被及时释放，以便它们可以被重新用于其他任务或通信。
    
*   清理状态：关闭会话还涉及清理与特定会话相关的所有内部状态信息，如缓存、连接状态标志等。这有助于保持系统的清晰性和可预测性，避免潜在的资源泄漏或状态冲突。
    
*   优化性能：及时释放资源有助于提高系统的整体性能。例如，通过快速释放网络带宽，可以减少延迟，提高后续通信的效率。
    
*   错误恢复：在遇到通信错误时，正确的关闭会话操作可以帮助系统更快地从错误状态中恢复，避免资源锁定或死锁情况的发生。
    

在请求结束后，及时关闭会话并释放相关资源是保持系统健康和高效运行的关键步骤。这不仅有助于优化资源利用，还能提高系统的稳定性和可靠性。

#### 约束与限制

关闭会话能力支持Phone、2in1、Tablet、Wearable设备。并且从5.1.1(19)开始，新增支持TV设备；从6.1.0(23)开始，新增支持Car设备。

#### 接口说明

具体API说明详见接口文档。

| 接口名 | 描述 |
| --- | --- |
| uint32_t HMS_Rcp_CloseSession(Rcp_Session **session); | 关闭会话。 |

#### 使用示例

1.  CPP侧导入模块。
    
    ```
    #include "RemoteCommunicationKit/rcp.h"
    #include <stdio.h>
    #include <unistd.h>
    ```
    
2.  CMakeLists.txt中添加以下lib。（具体请见C API开发准备）。
    
    ```
    librcp_c.so
    ```
    
3.  创建会话，会话发起请求后关闭会话。“
    
    ```
    void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode) {
        (void *)usrCtx;
        if (response != NULL) {
            printf("Response status: %d\n", response->statusCode);
        } else {
            printf("Fetch failed: errCode: %u\n", errCode);
        }
        if (response != NULL) {
            response->destroyResponse(response);
        }
    }
    
    int main() {
        const char *kHttpServerAddress = "";
        Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
        request->method = RCP_METHOD_GET;
        uint32_t errCode = 0;
        // 创建session
        Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
        // 配置请求回调
        Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
        // 发起fetch请求
        errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
        // 等待fetch结果，仅是等待异步调用完成，开发者可根据自己实际场景处理回调。
        usleep(1000 * 1000 * 3);
        printf("Fetch completed, errCode: %u\n", errCode);
        // 在退出前取消可能还在执行的requests
        errCode = HMS_Rcp_CancelSession(session);
        // 关闭session
        errCode = HMS_Rcp_CloseSession(&session);
        // 清理request
        HMS_Rcp_DestroyRequest(request);
        return 0;
    }
    ```