![(3) 네트워크(AF_ROUTE)에 연결되지 않은 경우에는 이러한 프로세스가 없습니다.](https://linux55.com/image/142827/(3)%20%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC(AF_ROUTE)%EC%97%90%20%EC%97%B0%EA%B2%B0%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EA%B2%BD%EC%9A%B0%EC%97%90%EB%8A%94%20%EC%9D%B4%EB%9F%AC%ED%95%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
네트워크에 연결되면 struct rt_msghdr*
커널에 적절한 경로를 보내고 받을 수 있습니다. 그러나 네트워크 연결을 끊고 동일한 라우팅 메시지 헤더를 보내려고 하면 소켓이 실패 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) {
// process errno
// * issue happens here when not connected to a network
}
// receive kernel response(s)
// process responses
close(sd);
헤더에 프로세스 ID(pid)가 올바르게 설정되어 있는 것을 확인했습니다. netstat -nr
네트워크에 연결되어 있지 않을 때 기본 경로로 돌아가는 데에는 문제가 없습니다. 이 코드가 왜 네트워크 연결에 의존하는지 이해할 수 없습니다.