Как я могу добавить ip-адрес порта сканирования

#c #sockets #server #client

#c #сокеты #сервер #клиент

Вопрос:

я кодирую сервер сканирования и клиент с помощью сканирования всех ip-адресов, я использую сокеты / C, но я не понимаю, как добавить порт сканирования для одного из ip-адресов в структуре, у меня проблема с портом сканирования, у меня неправильный дисплей, он не отображает никаких открытых, проблема в том, что на сервере не отображается ни один открытый порт. я не могу найти какое-либо решение, мне нужна помощь

 #include <netdb.h> 
#include "stdio.h"
#include <netinet/in.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <arpa/inet.h>
#define MAX 80 
#define PORT 8080 
#define SA struct sockaddr 

// Driver function 
int main() 
{ 
        int sockfd, connfd, len ,start , end,err;
        struct sockaddr_in servaddr, cli; 
        struct sockaddr_in addr_remote;
    char ips[2][20];
    char hostname[30];

    // socket create and verification 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) { 
    printf("socket creation failed...n"); 
    exit(0); 
    } 
    else
    printf("Socket successfully created..n"); 
    bzero(amp;servaddr, sizeof(servaddr)); 

    // assign IP, PORT 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(PORT); 

    // Binding newly created socket to given IP and verification 
    if ((bind(sockfd, (SA*)amp;servaddr, sizeof(servaddr))) != 0) { 
    printf("socket bind failed...n"); 
    exit(0); 
    } 
    else
    printf("Socket successfully binded..n"); 

    // Now server is ready to listen and verification 

    if ((listen(sockfd, 5)) != 0) { 
    printf("Listen failed...n"); 
    exit(0); 
    } 
    else
    printf("Server listening..n"); 
    len = sizeof(cli); 

    // Accept the data packet from client and verification 
 for(int i=0;i<2;i  ){
    connfd = accept(sockfd, (SA*)amp;addr_remote, amp;len); 
    if (connfd < 0) { 
    printf("server acccept failed...n"); 
    exit(0); 
    } 
    else
    printf("server acccept the client...n"); 
    strcpy(ips[i], inet_ntoa(addr_remote.sin_addr));
    }

    // Display Ip 
   for(int i=0;i<2;i  ){
    printf("%s n",ips[i]);}


    // Scan PORT

        //Get the hostname to scan
        printf("Enter hostname or IP : ");
        gets(hostname);

        //Get start port number
        printf("Enter start port number : ");
        //To Handle the Input
        int data;
        data = scanf("%d",amp;start);

        //Get end port number
        printf("Enter end port number : ");
        int data2 = scanf("%d" , amp;end);
        int j;
         //Start the port scan loop
            printf("Starting the portscan loop : n");
            for( j = start ; j <= end ; j  )
            {
            //Fill in the port number
            servaddr.sin_port = htons(j);

            //Connect using that socket and sockaddr structure

            err =connect(sockfd, (SA*)amp;servaddr, sizeof(servaddr));
            if( err < 0 )
            {
            //printf("%s %-5d %sr" , hostname , i, strerror(errno));
            fflush(stdout);
            }
            //connected
            else
            {
            printf("%-5d openn", j);
            }
        }

    // After chatting close the socket 
    close(sockfd); 
}
  

Комментарии:

1. Если одноранговый узел не отвечает, connect() вызов блокируется довольно долго, пока не будет достигнут тайм-аут подключения. Это ваша проблема?

2. да, он не отображает открытый порт адреса

Ответ №1:

Существуют не только состояния «открыто» и «закрыто», но и «отфильтровано», когда одноранговый узел вообще не отвечает на запрос на подключение. Это может произойти, когда хост вообще недоступен или когда определенный порт или диапазон портов отбрасывается из-за правил фильтрации пакетов.

Вы можете либо дождаться connect() тайм-аута (который может составлять несколько минут), либо переключиться на неблокирующие соединения:

 fcntl(sockfd, F_SETFL, O_NONBLOCK);
  

Теперь connect() вызов вернется немедленно, и вы можете вызвать select() или poll() для файлового дескриптора с произвольным таймаутом, чтобы ускорить сканирование.

Кроме того, таким образом вы можете сканировать несколько портов параллельно, что значительно ускоряет общее время сканирования.

Однако действительно эффективные сканеры работают с необработанными сокетами, создавая пакеты SYN и анализируя ответы.

Комментарии:

1. извините, но я ничего не понимаю 🙁 , как добавить порт сканирования в этот код ?