Необработанный сокет Linux и сообщение слишком длинное, recvfrom () возвращает размер больше 1500 - PullRequest
0 голосов
/ 02 ноября 2018

recvfrom() возвращает размер больше 1500, но я не могу найти пакеты, которые IP часть больше чем 1500 в wireshark. это вызывает ошибку, когда я пытаюсь отправить буфер recv из сокета swlan в другой необработанный сокет. Я получил ошибку "сообщение слишком длинное". Кто-нибудь может помочь ??

static void forward_packet_wlan() {
    int i;
    unsigned char buf[65536];
    struct sockaddr_ll sinfo;
    bzero(&sinfo,sizeof(sinfo));
    int froml=sizeof(sinfo);
    int mylen = recvfrom(swlan,buf+14,sizeof(buf)-14,0,(struct sockaddr*)&sinfo,&froml);
    if (mylen<0) {
        perror("read");
        exit(-1);
    }
    for (i=0;i<6;++i) buf[i]=destmac[i];
    for (i=0;i<6;++i) buf[i+6]=sinfo.sll_addr[i];
    memcpy(&buf[12],&(sinfo.sll_protocol),2);
    int sendlen = send(seth,buf,mylen+14,0);
    if(sendlen<0) {
        perror("send");
        exit(-1);
    }
}

Более связанный код:

swlan = get_rawsocket(argv[1],SOCK_DGRAM);


static int get_rawsocket(char* iface, int socktype) {
        struct sockaddr_ll b;
        struct packet_mreq mr;
        int i;
    bzero(&b,sizeof(b));
        b.sll_family=AF_PACKET;
        b.sll_protocol=htons(ETH_P_ALL);
        bzero(&mr,sizeof(mr));  
        int swlan = socket(PF_PACKET,socktype,htons(ETH_P_ALL));

        int ifindex = retrieveifindex(iface);
        b.sll_ifindex=ifindex;
        b.sll_protocol=htons(ETH_P_ALL);
        int err = bind(swlan,(const struct sockaddr *)&b,sizeof(b));
        if (err!=0) {
                perror("error bind");
        exit(-1);
        }
        mr.mr_ifindex=ifindex;
        mr.mr_type=PACKET_MR_PROMISC;
        if (setsockopt(swlan,SOL_PACKET,1,&mr,sizeof(mr))!=0) {
                perror("error setsockopt");
        exit(-1);
        }
        if (fcntl(swlan,F_SETFL,O_NONBLOCK)==-1) {
                perror("error nonblock");
        exit(-1);
        }
    return swlan;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...