#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. извините, но я ничего не понимаю 🙁 , как добавить порт сканирования в этот код ?