Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 00:21   #1
vizir1989
 
Регистрация: 07.05.2010
Сообщений: 9
По умолчанию UDP сканер портов под Linux

Всем доброго вечера!

Возникла потребность в написании UDP-сканера на C++ под линухой.

Вот что я нашел по этой теме
Сканирование UDP-портов проверкой ICMP-сообщения "Порт недоступен"
Большинство серверов в ответ на пакет, прибывший на закрытый UDP-порт, отправляют ICMP-сообщение "Порт недоступен" (Port Unreachable - PU). Таким образом, если в ответ на UDP-пакет пришло ICMP-сообщение PU, то сканируемый порт является закрытым, в противном случае (при отсутствии PU) порт открыт. Поскольку нет гарантии, что запросы от хоста дойдут до сервера, пользователь должен позаботиться о повторной передаче UDP-пакета, который, по всей видимости, оказался потерянным.

Сканирование UDP-портов с использованием функций recvfrom() и write()
Этот метод используется в случае, когда пользователь, проводящий сканирование, не обладает статусом Root на хосте. Поскольку не-root пользователь не может "читать" ICMP-сообщение PU, в ОС, поддерживающих механизм сокетов (например в Linux), имеется возможность получения информации о состоянии UDP-порта косвенным способом. Так, например, попытка вызова функции write() на закрытый порт обычно приводит к возникновению ошибки.
Функция recvfrom() в этом плане более информативна. Вызов ее на неблокированный UDP-сокет сервера обычно возвращает ошибку EAGAIN (Try Again - "попытайтесь еще раз", код 13) в случае, когда ICMP-сообщение не было принято, и ECONREFUSED (Connection Refused - "соединение закрыто", код 111), если ICMP-сообщение было принято. Таким образом, по этим признакам также возможно определить состояние портов сканируемого сервера.

Вот что я написал:
Код:
int main(int Count, char *Strings[])
{ char buffer[BUFSIZE];
 struct sockaddr_in addr;
 int sd, addr_size;

 if ( Count != 2 )
 {
  printf("usage: %s <msg>\n", Strings[0]);
  exit(0);
 }
 if ( (sd = socket(PF_INET, SOCK_DGRAM, 0)) < 0 )
 {
  perror("Socket");
  abort();
 }
 addr.sin_family = AF_INET;
 addr.sin_port = htons(9999);
 if ( inet_aton("127.0.0.1", &addr.sin_addr) == 0 )
 {
  perror("127.0.0.1");
  abort();
 }
 sendto(sd, Strings[1], strlen(Strings[1])+1, 0, (struct sockaddr*)&addr, sizeof(addr));
 bzero(buffer, BUFSIZE);
 addr_size = sizeof(addr);
 if ( recvfrom(sd, buffer, BUFSIZE, 0, (struct sockaddr*)&addr, &addr_size) < 0 )
  perror("server reply");
 else
  printf("Reply: %s:%d \"%s\"\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), buffer);
 close(sd);
 return 0;
}
но программа виснет на отправке сообщения и ни чего не выводиться. В чем может быть проблема? И как получить номер ошибки при recvfrom для определения состояния UDP порта?

P.S. компилиться командой cc -Wall -O2 -o client client.c. выболняется ./client. Все это делается не из под рута

Последний раз редактировалось vizir1989; 07.12.2010 в 00:26. Причина: дополнительные данные
vizir1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканер портов Bat{CMD}_Men Операционные системы общие вопросы 1 28.08.2010 12:29
Сканер портов OPF_Nik Помощь студентам 5 03.02.2010 18:07
Сканер портов OPF_Nik Работа с сетью в Delphi 2 29.01.2010 19:26
Сканер портов One.Love Работа с сетью в Delphi 4 18.02.2008 16:05