Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточный портсканер 
:(
    Опции темы
Robin
Дата 29.8.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



при создании многопоточного сканера портов возникла ошибка, при подключении к портам, причем она есть только в многопоточной версии, ели вызвать функцию отдельно то сканирование выходит нормально.   smile 

сурс ниже
Код



#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <windows.h>
#include <winsock2.h>

#define host "127.0.0.1"

int tryconnect(LPVOID param)
{
    SOCKET sock;
    struct sockaddr_in addr;
    int currentport, targetport, err;
    int port = (int)param;
    WSADATA wsaData;
    HOSTENT *hst;
    
    targetport = port + 100;
printf("%d targetport, %d port\n\n", targetport, port);
        err = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (err != NO_ERROR) {
      printf("WSAStartup failed: %d\n", err);
      return 1;
    }
        if ((sock=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        printf("Error socket %d\n",WSAGetLastError());
        WSACleanup(); 
        return 1;
    }


          addr.sin_family=AF_INET;
          if (inet_addr(host) != INADDR_NONE)
        addr.sin_addr.s_addr=inet_addr(host);
    else
    {
        if (hst=gethostbyname(host))
            addr.sin_addr.s_addr=((unsigned long **) hst->h_addr_list)[0][0];
        else
        {
            printf("Unknown host: %d\n",WSAGetLastError());
            closesocket(sock);
            WSACleanup();
            return 1;
        }
    }
    

    for(currentport = port; currentport <= targetport; ++currentport )
    {
        printf("in process\n");
        addr.sin_port = htons( currentport );

      err = (connect(sock,(sockaddr *)&addr,sizeof(addr)));..валится сдесь
      
      if(err != SOCKET_ERROR)
        
       {
        printf("%d - succesess\n", currentport);
     }
        else
      {
        printf("%d - error\n", currentport);
      }
    }
return 0;
}

int main(int argc, char *argv[])
{
    
    
    int startport, finalport;
    DWORD a;
    HANDLE hTHread;
    if(argc < 4)
    {
        //printf("Usage: thread.exe [resourse] [start port] [final port]");
        //return 1;
    }

    startport = atoi(argv[2]);
    finalport = atoi(argv[3]);
    //host = argv[1];

    for(startport; startport < finalport; startport += 100)
    {
    
        hTHread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tryconnect,  (void*)startport, NULL, &a);
        if(hTHread == NULL)printf("Error creating thread: %d", GetLastError());
    }
    
}




PS как можно передать в поток больше одного параметра?
PM MAIL   Вверх
MaXL
Дата 29.8.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата(Robin @  29.8.2007,  14:40 Найти цитируемый пост)
при создании многопоточного сканера портов возникла ошибка, при подключении к портам, причем она есть только в многопоточной версии, ели вызвать функцию отдельно то сканирование выходит нормально.

А какая именно возникал ошибка ?
Цитата(Robin @  29.8.2007,  14:40 Найти цитируемый пост)
как можно передать в поток больше одного параметра? 

а что если передавать структуру ?


--------------------
MaXL
PM MAIL   Вверх
Robin
Дата 29.8.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



MaXL просто выкинуло, никакая 
      err = (connect(sock,(sockaddr *)&addr,sizeof(addr)));//валится сдесь
PM MAIL   Вверх
jonie
Дата 29.8.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



а в винде нет ограничений на количество открытых одновременно сокетов?....
ЗЫ : код не смотрел... просто интересно самому вышеуказанный вопрос8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ptr
Дата 30.8.2007, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(jonie @  30.8.2007,  00:34 Найти цитируемый пост)
а в винде нет ограничений на количество открытых одновременно сокетов?....

Есть.

Цитата(Robin @  29.8.2007,  19:13 Найти цитируемый пост)
MaXL просто выкинуло, никакая 

А что там другое должно происходить?

1. WSAStartup не нужно вызывать в каждом потоке. Достаточно сделать один вызов.
2. Программа вообще правильно не должна работать. Кто будет проверять ошибки, которые происходят (WSAGetLastError). У connect возможна ошибка WSAEISCONN. Поэтому после удачного коннекта надо сокет пересоздавать.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.