c - 没有连接到网络(AF_ROUTE)时没有这样的过程(3)
问题描述
当我连接到网络时,我可以向struct rt_msghdr*
内核发送 a 并接收相应的路由。但是,当我断开与网络的连接并尝试发送相同的路由消息头时,套接字send()
以errno = ESRCH (3) No such process
.
通用代码:(在 MacOS 上测试)
int sd = create_socket(AF_ROUTE, IPPROTO_RAW, AF_UNSPEC);
memset(&buffer[0], 0, buffer.size());
struct rt_msghdr* rmh = (struct rt_msghdr*)(&buffer[0]);
rmh->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
rmh->rtm_version = RTM_VERSION;
rmh->rtm_type = RTM_GET;
rmh->rtm_addrs = RTA_DST;
rmh->rtm_pid = getpid();
rmh->rtm_seq = 1;
struct sockaddr_in* sa_in = (struct sockaddr_in*)(rmh + 1);
sa_in->sin_len = sizeof(struct sockaddr_in);
sa_in->sin_family = AF_INET;
int status;
if ((status = send(sd, rmh, rmh->rtm_msglen, 0) < 0) {
rmh->rtm_msglen =
sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in6);
struct sockaddr_in6* sa_in6 = (struct sockaddr_in6*)(rmh + 1);
memset(sa_in6, 0, sizeof(struct sockaddr_in6));
sa_in6->sin6_len = sizeof(struct sockaddr_in6);
sa_in6->sin6_family = AF_INET6;
if ((status = send(sd, rmh, rmh->rtm_msglen, 0) < 0) {
// process errno
// * issue happens here when not connected to a network
}
}
// receive kernel response(s)
// process responses
close(sd);
我验证了在标题中正确设置了进程 ID (pid)。netstat -nr 在未连接到网络时返回默认路由而不会出现问题。我无法理解为什么此代码依赖于网络连接。
结果来自netstat -nr
:
# with a network connection (Internet)
Destination Gateway Flags Refs Use Netif Expire
default X.X.X.X UGSc 58 0 en1
# without a network connection (Internet6)
Destination Gateway Flags Netif Expire
default fe80::%utun0 UGcI utun0
解决方案
推荐阅读
- shell - 如何在shell脚本linux上使用case语句
- python - 错误:libfreetype.6.dylib 需要 54.0.0 或更高版本,但 libpng16.16.dylib 提供 52.0.0 版本
- tensorflow - IN CNN 无法训练我所有的样本图像
- virtual-machine - Proxmox 减少(缩小)硬盘虚拟机
- grails - 将 Groovy 脚本的结果放入 GSP
- javascript - 为什么即使我使用异步和等待,项目的总计数始终为零
- laravel - 当我使用限制或接受 whereIn 时,laravel eger 加载无法正常工作
- javascript - 如何在 CSS/HTML/JS 上创建虚线
- r - 模型未能与 max|grad| 收敛
- android - 如何在 FlatList React Native 中实现复选框