Необработанный сокет использует epoll без получения ack-пакета - PullRequest
0 голосов
/ 25 января 2019

Мне нужно использовать tcp полуоткрытое сканирование, чтобы проверить состояние порта большого количества серверов.

I sendto() пакет с syn=1 для уничтожения destport,и должен recvfrom() пакет, если syn=1 и ack=1, порт открыт, иначе, если rst=1, порт закрыт.

Я использую epoll , после отправки сокетастатус сокета пакета become не становится EPOLLIN.

Этот пакет подтверждения не является EPOLLIN?

Я установил socket IP_HDRINCL ,, чтобы я мог построитьпсевдо заголовок с syn=1, и я попробовал неблокированный сокет и блочный сокет , оба не работают.

это часть моего кода:

int main()
{
    char localIp[20] = {0}; 
    GetSelfServerIP(localIp);//to get local IP
    int epollfd = epoll_create(1);
    if (epollfd  == -1)
    {
        error(1, errno, "Error epoll creating");
        return 0;
    }
    SOCKET sock = socket (AF_INET, SOCK_RAW, IPPROTO_TCP);
    if(!IS_VALID_SOCK(sock))
        error(1, 0, "Error socket initialization");
    if(SetNonBlock(sock) < 0)
        error(1, errno, "Error switching socket to non-block mode.");
    if(SetReusable(sock) < 0)
        error(1, errno, "Error making socket reusable");
    if(SetHdrincl(sock) < 0)
        error(1, errno, "Error making socket Hdrincl");
    struct epoll_event ev; //only one ev for test
    ev.events = EPOLLIN | EPOLLPRI;
    ev.data.fd = sock;  
    if (epoll_ctl(epollfd, EPOLL_CTL_ADD, ev.data.fd, &ev) == -1)
        error(1, errno, "Error adding event m to epoll");
    char * targetip = "xxx.xxx.xxx.xxx";//test target ip
    struct epoll_event events[1];
    memset(events, 0, sizeof(struct epoll_event));
    while(1)
    {
        Sendpacket(ev.data.fd,localIp,get_random_sport(),targetIp);//to send syn=1 packet to targetIp port 1 to 1000;
        size_t nfds = epoll_wait(epollfd, events, 2, 1000);
        size_t i = 0;
        if (nfds == -1)
            error(1, errno, "Error calling epoll");
        for (i = 0; i < nfds; ++i)
        {
            if ((events[i].events & EPOLLIN) == EPOLLIN ||
                    (events[i].events & EPOLLPRI) == EPOLLPRI)
            {
                int sock_raw;
                int saddr_size, data_size;
                struct sockaddr saddr;
                unsigned char *buffer = (unsigned char *)malloc(65536); //Its Big!
                saddr_size = sizeof saddr;
                data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, &saddr_size);
                if(data_size <0 )
                {
                    printf("Recvfrom error , failed to get packets\n");
                    fflush(stdout);
                    return 1;
                }
                //Now process the packet
            }
        }
        fflush(stdout);
    }
    return 1;
}


1. events[i].event всегда == EPOLLOUT

2. data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, &saddr_size) data_size всегда <0. </p>

...