(3)ネットワーク(AF_ROUTE)に接続していない場合は、これらのプロセスはありません。

(3)ネットワーク(AF_ROUTE)に接続していない場合は、これらのプロセスはありません。

ネットワークに接続すると、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ネットワークに接続していない場合、デフォルトルートに戻るのに問題はありません。このコードがなぜネットワーク接続に依存するのか理解できません。

ベストアンサー1

おすすめ記事