HarmonyOS 鸿蒙Next native 连接socket

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next native 连接socket

在arkts侧,声明了一个socket server并运行,然后调用native侧的C++ 进行socket连接。 C++侧代码运行了,但是arkts侧未收到连接及消息。 感觉像是线程阻塞了。 请问应该如何处理呢

2 回复

1)您检查下是否添加了"ohos.permission.INTERNET"权限。 2)参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/net-mgmt-overview-V5

1)native测connect需要起独立线程,不然时间链接较长会导致当前线程freeze。起线程后验证ok

2)您可参考以下demo :

static napi_value Add(napi_env env, napi_callback_info info)

{

napi_value result;

std::thread th([](){

auto client_socket = socket(AF_INET, SOCK_STREAM, 0);

if (client_socket == -1) {

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, tag,

"测试 create socket fail");

return;

}

sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_port = htons(7890);

if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {

std::cerr << "测试 Invalid address" << std::endl;

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, tag,

"测试 Invalid address");

return;

}

// 连接到服务器

if (connect(client_socket, (sockaddr*)&server_addr, sizeof(server_addr)) < 0) {

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, tag,

"测试 Connection failed");

return;

}

// 发送消息

const char* message = "dqwdqwdwqdqwsss";

send(client_socket, message, strlen(message), 0);

// 接收服务器响应

char buffer[1024] = {0};

int bytes_received = recv(client_socket, buffer, sizeof(buffer) - 1, 0);

if (bytes_received > 0) {

buffer[bytes_received] = '\0'; // 确保字符串结束

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, tag,

"测试 Received from server: %{public}s", buffer);

} else {

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, tag,

"测试 Receive failed");

}

// 关闭 socket

close(client_socket);

});

th.detach();

napi_create_double(env, 1, &result);

return result;

}

在HarmonyOS(鸿蒙)Next native环境中连接socket,通常需要按照以下步骤进行:

  1. 初始化Socket:首先,通过调用socket()函数来创建一个socket描述符,指定协议族(如AF_INET表示IPv4)、socket类型(如SOCK_STREAM表示TCP)以及协议(通常为0,表示自动选择)。

  2. 配置Socket地址:使用sockaddr_in结构体来设置目标地址和端口,然后调用bind()(如果需要绑定本地地址)或connect()来建立连接。

  3. 连接Socket:对于客户端,使用connect()函数并传入目标地址和端口来建立连接。服务器端则通常使用listen()accept()来监听并接受连接。

  4. 数据传输:连接建立后,可以使用send()recv()函数进行数据传输。

  5. 关闭Socket:数据传输完成后,调用close()函数关闭socket连接。

确保在代码中包含必要的头文件,如<sys/types.h><sys/socket.h><netinet/in.h>等,这些头文件定义了socket编程所需的类型和函数。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部