Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中添加arp条目_C_Linux - Fatal编程技术网

C 在Linux中添加arp条目

C 在Linux中添加arp条目,c,linux,C,Linux,仔细阅读问题以提出解决方案,请 我需要在Linux中添加永久的arp条目 问题是:如果我通过shell或套接字添加一个条目,它总是得到标志0x6。即使我使用下面发布的代码,在这里我指定了标志,它仍然保持不变,0x6 我找到了有关0x6标志的以下信息: 请注意ARP标志“0x6”。带有标志0x6的ASIC ARP条目为 MAC缓存相关条目。这是由于arp查找失败造成的 安装会话。会话将尝试使用源MAC 传入数据包的地址,但它不是使用此mac所必需的 地址。我们可以在回复包到达时获得MAC地址 向源

仔细阅读问题以提出解决方案,请

我需要在Linux中添加永久的arp条目

问题是:如果我通过shell或套接字添加一个条目,它总是得到标志0x6。即使我使用下面发布的代码,在这里我指定了标志,它仍然保持不变,0x6

我找到了有关0x6标志的以下信息:

请注意ARP标志“0x6”。带有标志0x6的ASIC ARP条目为 MAC缓存相关条目。这是由于arp查找失败造成的 安装会话。会话将尝试使用源MAC 传入数据包的地址,但它不是使用此mac所必需的 地址。我们可以在回复包到达时获得MAC地址 向源主机发送ARP数据包

因此,每当我添加任何arp条目,然后我ping相同的ip地址,它总是导致arp请求广播

问题是,有没有办法添加一个带有适当标志的永久ARP条目?因此,我添加了一个条目,如果以后有任何通信,将不会有任何ARP广播?

顺便说一句,为了了解我在做什么:我从PC1发送一个包含PC1的IP和MAC的广播(L3),PC2获取数据包并将地址添加到ARP表中并建立TCP会话,但总是首先运行ARP广播

通过壳牌:

#!/bin/sh
arp -s $1 $2 2>/dev/null
通过插座:

char *mac_ntoa(unsigned char *ptr){
    static char address[30];

    sprintf(address, "%02X:%02X:%02X:%02X:%02X:%02X",
        ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);

    return(address);
} /* End of mac_ntoa */

int mac_aton(char *addr, unsigned char *ptr){
    int i, v[6];
    if((i = sscanf(addr, "%x:%x:%x:%x:%x:%x", &v[0], &v[1], &v[2], &v[3],
            &v[4], &v[5])) !=6){

        fprintf(stderr, "arp: invalid Ethernet address '%s'\n", addr);
        return(1);
    } /* End of If*/

    for(i = 0; i < 6; i++){
        ptr[i] = v[i];
    } /* End of For */

    return(0);
}

int main(int argc, char* argv[]){
    if(argc < 3 || argc > 4){
        fprintf(stderr,"usage: %s <ip_addr> <hw_addr> [temp|pub|perm|trail]\n",
            argv[0]);
        fprintf(stderr, "default: temp.\n");
        exit(-1);
    } /* End of If */

    int s, flags;
    char *host = argv[1];

    struct arpreq req;
    struct hostent *hp;
    struct sockaddr_in *sin;

    bzero((caddr_t)&req, sizeof(req)); /* caddr_t is not really needed. */

    sin = (struct sockaddr_in *)&req.arp_pa;
    sin->sin_family = AF_INET;
    sin->sin_addr.s_addr = inet_addr(host);

    if(sin->sin_addr.s_addr ==-1){
        if(!(hp = gethostbyname(host))){
            fprintf(stderr, "arp: %s ", host);
            herror((char *)NULL);
            return(-1);
        } /* End of If */
        bcopy((char *)hp->h_addr,
            (char *)&sin->sin_addr, sizeof(sin->sin_addr));
    } /* End of If */

    if(mac_aton(argv[2], req.arp_ha.sa_data)){ /* If address is valid... */
        return(-1);
    }

    argc -=2;
    argv +=2;

    flags = ATF_PERM | ATF_COM;

    while(argc-- > 0){
        if(!(strncmp(argv[0], "temp", 4))){
            flags &= ~ATF_PERM;
        } else if(!(strncmp(argv[0], "pub", 3))){
            flags |= ATF_PUBL;
        } else if(!(strncmp(argv[0], "trail", 5))){
            flags |= ATF_USETRAILERS;
        } else if(!(strncmp(argv[0], "dontpub", 7))){ /* Not working yet */
            flags |= ATF_DONTPUB;
        } else if(!(strncmp(argv[0], "perm", 4))){
            flags = ATF_PERM;
        } else {
            flags &= ~ATF_PERM;
        } /* End of Else*/
    argv++;
    }/* End of While */

    req.arp_flags = flags; /* Finally, asign the flags to the structure */
    strcpy(req.arp_dev, "eth0"); /* Asign the device.  */

    if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
        perror("socket() failed.");
        exit(-1);
    } /* End of If */

    if(ioctl(s, SIOCSARP, (caddr_t)&req) <0){ /* caddr_t not really needed. */
        perror(host);
        exit(-1);
    } /* End of If */

    printf("ARP cache entry successfully added.\n");
    close(s);
    return(0);
}
char*mac\u ntoa(无符号char*ptr){
静态字符地址[30];
sprintf(地址,“%02X:%02X:%02X:%02X:%02X:%02X:%02X”,
ptr[0]、ptr[1]、ptr[2]、ptr[3]、ptr[4]、ptr[5]);
报税表(地址);
}/*mac_ntoa结束*/
int mac_aton(字符*addr,未签名字符*ptr){
int i,v[6];
如果((i=sscanf(addr,“%x:%x:%x:%x:%x:%x”、&v[0]、&v[1]、&v[2]、&v[3],
&v[4],&v[5])!=6){
fprintf(stderr,“arp:无效的以太网地址“%s”\n”,addr);
申报表(1);
}/*如果结束*/
对于(i=0;i<6;i++){
ptr[i]=v[i];
}/*本次会议结束*/
返回(0);
}
int main(int argc,char*argv[]){
如果(argc<3 | | argc>4){
fprintf(标准,“用法:%s[temp | pub | perm | trail]\n”,
argv[0]);
fprintf(stderr,“默认值:temp.\n”);
出口(-1);
}/*如果结束*/
int s,旗帜;
char*host=argv[1];
结构arpreq req;
结构主机*hp;
结构sockaddr_in*sin;
bzero((caddr_t)&req,sizeof(req));/*实际上并不需要caddr_t*/
sin=(结构sockaddr_in*)和req.arp_pa;
sin->sin\u family=AF\u INET;
sin->sin\u addr.s\u addr=inet\u addr(主机);
如果(sin->sin\u addr.s\u addr==-1){
如果(!(hp=gethostbyname(主机))){
fprintf(标准,arp:%s,主机);
herror((字符*)空);
返回(-1);
}/*如果结束*/
b复制((字符*)hp->h_地址,
(char*)和sin->sin_addr,sizeof(sin->sin_addr));
}/*如果结束*/
if(mac_aton(argv[2],req.arp_ha.sa_data)){/*如果地址有效*/
返回(-1);
}
argc-=2;
argv+=2;
flags=ATF_PERM | ATF_COM;
而(argc-->0){
if(!(strncmp(argv[0],“temp”,4))){
标志&=~ATF\U PERM;
}else if(!(strncmp(argv[0],“pub”,3))){
标志|=ATF|U PUBL;
}else if(!(strncmp(argv[0],“trail”,5))){
旗子|=自动变速箱/拖车;
}否则如果(!(strncmp(argv[0],“dontpub”,7)){/*尚未工作*/
旗帜|=ATF|U DONTPUB;
}else if(!(strncmp(argv[0],“perm”,4))){
标志=ATF_PERM;
}否则{
标志&=~ATF\U PERM;
}/*其他项目结束*/
argv++;
}/*结束*/
req.arp_flags=flags;/*最后,将这些标志分配给结构*/
strcpy(req.arp_dev,“eth0”)/*为设备签名*/
如果((s=socket(AF_INET,SOCK_DGRAM,0))<0){
perror(“套接字()失败”);
出口(-1);
}/*如果结束*/

if(ioctl(s,SIOCSARP,(caddr_t)&req)0x06标志值意味着该条目是完整且永久的。因此我猜您的shell脚本足以添加一个静态arp条目。以下是相关的标志值-

#define ATF_COM 0x02        /* completed entry (ha valid)   */
#define ATF_PERM    0x04        /* permanent entry      */
您发布的标志0x06的定义与linux内核无关

您看到arp请求的原因可能是您的拓扑或IP地址存在问题。您可以发布这些详细信息吗?或者您可以发布数据包跟踪,其中PC2执行arp请求,即使它具有静态arp条目