ioctlを使用してゲートウェイを追加してNetwork is unreachableを生成する理由
コードは次のとおりです.
ゲートウェイを追加する場合、ゲートウェイIPとIPアドレスが同じセグメント内にない限り、ioctlはNetwork is unreachableエラーを引き起こす.IP、netmask、gatewayの設定が正しければよい.
#define DBG_ERR(x...) perror(x)
int net_add_gateway(in_addr_t addr)
{
struct rtentry rt;
int skfd;
struct sockaddr_in sa = {
sin_family:PF_INET,
sin_port:0
};
/* Clean out the RTREQ structure. */
memset((char *) &rt, 0, sizeof(struct rtentry));
/* Fill in the other fields. */
rt.rt_flags = (RTF_UP | RTF_GATEWAY);
rt.rt_dst.sa_family = PF_INET;
rt.rt_genmask.sa_family = PF_INET;
sa.sin_addr.s_addr = addr;
memcpy((char *) &rt.rt_gateway, (char *) &sa, sizeof(struct sockaddr));
/* Create a socket to the INET kernel. */
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
DBG_ERR("socket error");
return -1;
}
/* Tell the kernel to accept this route. */
if (ioctl(skfd, SIOCADDRT, &rt) < 0) {
DBG_ERR("net_add_gateway: ioctl SIOCADDRT");
close(skfd);
return -1;
}
/* Close the socket. */
close(skfd);
return (0);
}
ゲートウェイを追加する場合、ゲートウェイIPとIPアドレスが同じセグメント内にない限り、ioctlはNetwork is unreachableエラーを引き起こす.IP、netmask、gatewayの設定が正しければよい.