完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
getsockname是否也需要在内核通过自定义dev来获取啊?static int _eXosip_default_gateway_ipv4(char* destination, char* address, int size){ socklen_t len; int sock_rt, on = 1; struct sockaddr_in iface_out; struct sockaddr_in remote; int type; printf("n------ [DEBUG] Start _eXosip_default_gateway_ipv4 ------n"); printf("[DEBUG] Input: destination=%s, address=%p, size=%dn", destination ? destination : "NULL", address, size); // Step 1: 初始化目标地址结构体 memset(&remote, 0, sizeof(struct sockaddr_in)); remote.sin_family = AF_INET; remote.sin_addr.s_addr = inet_addr(destination); remote.sin_port = htons(11111); printf("[DEBUG] Remote address set: family=AF_INET, addr=%s, port=11111n", inet_ntoa(remote.sin_addr)); // Step 2: 创建 UDP 套接字 memset(&iface_out, 0, sizeof(iface_out)); type = SOCK_DGRAM;#if defined(SOCK_CLOEXEC) type = SOCK_CLOEXEC | SOCK_DGRAM;#endif sock_rt = socket(AF_INET, type, 0); printf("[DEBUG] socket() called: AF_INET, type=%d, protocol=0n", type); if (sock_rt == -1) { printf("[ERROR] socket() failed! errno=%d (%s)n", errno, strerror(errno)); snprintf(address, size, "127.0.0.1"); return OSIP_NO_NETWORK; } printf("[DEBUG] socket() returned fd=%dn", sock_rt); // Step 3: 设置 SO_BROADCAST 选项 if (setsockopt(sock_rt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -1) { printf("[ERROR] setsockopt(SO_BROADCAST) failed! errno=%d (%s)n", errno, strerror(errno)); _eXosip_closesocket(sock_rt); snprintf(address, size, "127.0.0.1"); return OSIP_NO_NETWORK; } printf("[DEBUG] setsockopt(SO_BROADCAST) successn"); // Step 4: 连接目标地址(模拟路由选择) printf("[DEBUG] Attempting connect() to %s:11111...n", inet_ntoa(remote.sin_addr)); if (connect(sock_rt, (struct sockaddr*)&remote, sizeof(struct sockaddr_in)) == -1) { printf("[ERROR] connect() failed! errno=%d (%s)n", errno, strerror(errno)); _eXosip_closesocket(sock_rt); snprintf(address, size, "127.0.0.1"); return OSIP_NO_NETWORK; } printf("[DEBUG] connect() success (UDP pseudo-connection established)n"); // Step 5: 获取本地绑定地址(出口 IP) len = sizeof(iface_out); printf("[DEBUG] Calling getsockname()...n"); if (getsockname(sock_rt, (struct sockaddr*)&iface_out, &len) == -1) { printf("[ERROR] getsockname() failed! errno=%d (%s)n", errno, strerror(errno)); _eXosip_closesocket(sock_rt); snprintf(address, size, "127.0.0.1"); return OSIP_NO_NETWORK; } printf("[DEBUG] getsockname() returned: family=%d, addr=%s, port=%dn", iface_out.sin_family, inet_ntoa(iface_out.sin_addr), ntohs(iface_out.sin_port)); // iface_out.sin_addr. // Step 6: 关闭套接字 _eXosip_closesocket(sock_rt); printf("[DEBUG] Socket closed (fd=%d)n", sock_rt); // Step 7: 验证获取的 IP 是否有效 if (iface_out.sin_addr.s_addr == 0) { printf("[WARN] getsockname() returned 0.0.0.0! No valid route to destination?n"); snprintf(address, size, "127.0.0.1"); return OSIP_NO_NETWORK; } // Step 8: 返回结果 printf("[DEBUG] Final local interface IP: %sn", inet_ntoa(iface_out.sin_addr)); osip_strncpy(address, inet_ntoa(iface_out.sin_addr), size - 1); printf("------ [DEBUG] End _eXosip_default_gateway_ipv4 (SUCCESS) ------nn"); return OSIP_SUCCESS;}期待结果和实际结果
软硬件版本信息 错误日志 ------ [DEBUG] Start _eXosip_default_gateway_ipv4 ------[DEBUG] Input: destination=217.12.3.11, address=0x100a5cb20, size=128[DEBUG] Remote address set: family=AF_INET, addr=217.12.3.11, port=11111[DEBUG] socket() called: AF_INET, type=524290, protocol=0[DEBUG] socket() returned fd=27[DEBUG] setsockopt(SO_BROADCAST) success[DEBUG] Attempting connect() to 217.12.3.11:11111...[DEBUG] connect() success (UDP pseudo-connection established)[DEBUG] Calling getsockname()...[DEBUG] getsockname() returned: family=2, addr=0.0.0.0, port=49158[DEBUG] Socket closed (fd=113246210)[WARN] getsockname() returned 0.0.0.0! No valid route to destination?[E/sal.skt] not find network interface device by protocol family(16).[E/sal.skt] SAL socket protocol family input failed, return error -3.尝试解决过程 |
|
相关推荐
1个回答
|
|
|
在Linux内核中, 1. |
|
|
|
|
只有小组成员才能发言,加入小组>>
AI_cube训练模型得到了npy文件,没有kmodel文件
775 浏览 0 评论
请问K230 V3.0版本烧录固件和使用IDE到底是烧录哪个啊?
741 浏览 0 评论
444浏览 4评论
AI Cube进行yolov8n模型训练,创建项目目标检测时显示数据集目录下存在除标注和图片外的其他目录如何处理?
465浏览 3评论
autodl算力云在.pt转换onnx文件时正常,但onnx转.kmodel文件时报错,为什么?
554浏览 2评论
如何在大核rtt上把kd_mpi_vicap_start_stream三个摄像头各自出的流拼成一个流呢?
172浏览 2评论
573浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 10:18 , Processed in 0.786379 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
348
