Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > многопоточный портсканер


Автор: Robin 29.8.2007, 14:40
при создании многопоточного сканера портов возникла ошибка, при подключении к портам, причем она есть только в многопоточной версии, ели вызвать функцию отдельно то сканирование выходит нормально.   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 как можно передать в поток больше одного параметра?

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

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

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

Автор: Robin 29.8.2007, 16:13
MaXL просто выкинуло, никакая 
      err = (connect(sock,(sockaddr *)&addr,sizeof(addr)));//валится сдесь

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

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

Есть.

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)