localhost 127.0.0.1
端口范围建议为 10000 - 20000),并开始等待接收 UDP 包。sendMessage()
发送业务自定义的数据包,云端应用 UDP 服务收到请求,解析出 UDP 来源地址。onMessage()
接口中处理回传的数据包。let timer = null;const { sendMessage, code } = await TCGSDK.createCustomDataChannel({destPort: xxxx, // destPort 端口范围建议为 10000-20000onMessage: (res) => {console.log('CustomDataChannel onMessage', res);// 收到该回调后,表示云端应用已成功拉起并成功向web 端发送数据,可以 clearInterval,之后正常发送数据// clearInterval(timer);},});// code 为0表示 web 端与云端数据通道已建立成功,但可能此时云端应用并未完全拉起(应用不能收发数据),web 端可以通过 setTimeout/setInterval/轮询等形式发送初始数据,直到云端应用正常回包。if (code === 0) {// 发送自定义数据sendMessage('test');}if (code === 1 || code === -1) {// 创建失败考虑 retry// timer = setInterval(() => {// sendMessage('test');// }, 5000);} else {// 考虑重新创建数据通道}
int main() {int udp_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);if (udp_socket_fd == -1) {printf("socket failed!\\n");return -1;}// 设置目的 IP 地址struct sockaddr_in bind_addr = { 0 };bind_addr.sin_family = AF_INET;bind_addr.sin_port = htons(xxxx); // htons(xxxx) 中的端口范围建议为 10000-20000bind_addr.sin_addr.s_addr = inet_addr("0.0.0.0"); // 绑定 IP// 绑定端口int ret = bind(udp_socket_fd, (struct sockaddr *)&bind_addr, sizeof(bind_addr));if (ret < 0) {perror("bind fail:");close(udp_socket_fd);return -1;}// 开始等待客户端消息struct sockaddr_in upstream_addr = { 0 }; // 用来存放云渲染代理的地址int len = sizeof(upstream_addr);char buf[1024] = { 0 }; // 接收消息缓冲区while (true) {ret = recvfrom(udp_socket_fd, buf, sizeof(buf), 0, (struct sockaddr *)&upstream_addr, &len);if (ret == -1) {break;}// buf 为前端发来的消息 "test"// 后续可以用 upstream_addr 回传消息给前端const char* response = "response";sendto(udp_socket_fd, response, strlen(response), 0, (struct sockaddr *)&upstream_addr, sizeof(upstream_addr));}return 0;}
onMessage
回调中确定收到云端应用数据,可以取消轮询,之后正常发送数据。sendMessage()
接口支持 string | ArrayBuffer 数据类型。
本页内容是否解决了您的问题?