Index · Правила · Поиск· Группы · Регистрация · Личные сообщения· Вход

Список разделов Компьютерный раздел
 
 
 

Раздел: Компьютерный раздел C++ проверить определенный порт у группы компьютеров 

Создана: 20 Августа 2008 Срд 22:42:57.
Раздел: "Компьютерный раздел"
Сообщений в теме: 2, просмотров: 630

  1. error


    Хранитель


    Более 10 лет на форумеМуж.
    20 Августа 2008 Срд 22:42:57
    Вот встала передо мной такая задача.
    Есть диапазон ip-адресов: xxx.yyy.zzz.ccc и порт: ppp
    Я не знаю только значение zzz.

    Необходимо пробежаться по всем ip-адресам, перебирая zzz от 0 до 254.
    Если компьютер живой (как лучше это проверить?), то проверить открыт ли на нем порт ppp. Если открыт, то вывести найденный ip и прекратить поиск.

    Написал такую прогу на C++ Builder 6:
    Код:

      SOCKET socket1;
      WSADATA winSockData;
      sockaddr_in peer;
      char ipaddr[25];
      unsigned short port;
      int result;
      int ipdiap;
      bool find = FALSE;
      WSAStartup(0x0101, &winSockData);

      ProgressBar1->Max=254;
      ProgressBar1->Min=0;
      ProgressBar1->Position=0;

            for(ipdiap=0;ipdiap<=254;ipdiap++)
            {
             ProgressBar1->Position=ipdiap;
             Edit3->Text=ipdiap;
             strcpy(ipaddr,"");
             strcat(ipaddr,Edit1->Text.c_str());
             strcat(ipaddr,".");
             strcat(ipaddr,Edit2->Text.c_str());
             strcat(ipaddr,".");
             strcat(ipaddr,Edit3->Text.c_str());
             strcat(ipaddr,".");
             strcat(ipaddr,Edit4->Text.c_str());
             peer.sin_addr.s_addr = inet_addr(ipaddr);
             socket1 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
             peer.sin_family = AF_INET;
             peer.sin_port = htons(StrToInt(Edit5->Text));
             result = connect(socket1, (sockaddr *) &peer, sizeof(peer));
             if (result != 0) {
                    closesocket(socket1);
                    WSACleanup();
             }
             else {
                    Memo1->Lines->Add("Компьютер найден:");
                    Memo1->Lines->Add(ipaddr);
                    find = TRUE;
                    closesocket(socket1);
                    WSACleanup();
                    break;
             }
            }
      if(find == FALSE)
      {
            Memo1->Lines->Add("Не найдено.");
      }


    Но она почему-то сначала делает большую задержку (порядка 10-15 секунд), а потом быстро пробегает до конца. Сообщает что компьютеров не обнаружено, хотя они там точно есть. Если компьютер находится в начале списка то он определяется.

    Уважаемые знатоки, помогите советом.
    з.ы. Сильно не пинать, на c++ редко программирую.
  2. 21 Августа 2008 Чтв 0:03:15
    WSACleanup внутри цикла, думаю, не в тему. вынеси за цикл из обоих ветвлений