Newsgroup: it.comp.lang.c++
Titolo: scanning di porte

Non so se sono OT, scusatemi se lo sono ma con tutta sincerità ancora non
riesco a capire bene cosa sia IT in questo NG (dico veramente...non è una
provocazione o una polemica)...ho capito però che sono OT i prog per
windows!
Cmq, vorrei realizzare un prog che dato un IP fa lo scanning di tutte le
porte e mi riferisce quelle aperte.
Se non è OT, mi sapreste dare qualche link per partire?
Grazie
-- 
Roberto Pazzini
#158 dei FeSTosi
Webmaster di Arrampicata.net
http://www.arrampicata.net
Webmaster del sito ufficiale di free.it.giochi.neverwinternights
http://bebbbo.altervista.org

 Grazie
Sei OT per il semplice fatto che il C++ non prevede porte
o socket e quindi tutto quello che riguarda il loro uso e' OT.
Un buon punto di partenza direi che e' google.
Ciao
Gaetano

Borland Builder c++
Per il momento ho trovato solo questo!!!
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
#include <stdlib.h>
#include <stdio.h>
#include<windows.h>
#include<winbase.h>
#include<winsock2.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TScanner *Scanner;
#define MAXLENIP 15
DWORD WINAPI Dispatcher( LPVOID lpParam );
DWORD WINAPI Scan( LPVOID lpParam );
HANDLE hThread;//Dispatcher di thread per la scansione
DWORD dwThreadId;
DWORD RetThread;
struct _DatiDispatcher{
    char ipmacchina[MAXLENIP+1];
    int beginPort;
    int endPort;
    int timeout;
    int threadNum;
};
struct _DatiDispatcher datiDispatcher;
struct _DatiScan{
    char ipmacchina[MAXLENIP+1];
    int port;
    int timeout;
    unsigned char * used;
};
//---------------------------------------------------------------------------
int InitSocket(void)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 2, 0 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        return 1;
    }
    if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion )
!= 0 ) {
        WSACleanup( );
        return 1;
    }
    return 0;
}
//---------------------------------------------------------------------------
void init_sockaddr_out(struct sockaddr_in *name,char* nome, unsigned
short int port)
{
   struct hostent *Host;
   Host=gethostbyname(nome);
   if (!Host){
      return;
   }
   name->sin_family = AF_INET;
   name->sin_port = htons (port);
   memcpy(&(name->sin_addr.S_un.S_addr),Host->h_addr_list[0],4);
}
//---------------------------------------------------------------------------
__fastcall TScanner::TScanner(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TScanner::startClick(TObject *Sender)
{
/*
    HANDLE hThread;//Dispatcher di thread per la scansione
    DWORD dwThreadId;
    DWORD RetThread;
    //prelevo i valori necessari
    struct _DatiDispatcher datiDispatcher;
*/
    ipMachine->GetTextBuf(datiDispatcher.ipmacchina,MAXLENIP);
    datiDispatcher.beginPort=atoi(beginPort->Text.c_str());
    datiDispatcher.endPort=atoi(endPort->Text.c_str());
    datiDispatcher.timeout=atoi(timeoutScan->Text.c_str());
    datiDispatcher.threadNum=atoi(thread->Text.c_str());
    Screen->Cursor=crHourGlass;
    hThread = CreateThread(NULL,4096,Dispatcher,(LPVOID)&datiDispatcher
,0,&dwThreadId);
   // Check the return value for success.
}
//---------------------------------------------------------------------------
DWORD WINAPI Dispatcher( LPVOID lpParam )
{
    //Metodo(Thread) dispaccer di thread per il test sulle porte
    //lpParam e' un puntatore alla struct DatiDispatcher
//    DWORD RetThread1;
    HANDLE* hThread1;
    DWORD* dwThreadId1;
    unsigned char * usedThread;
    struct _DatiScan* datiScan;
    struct _DatiDispatcher datiDispatcher=*(struct _DatiDispatcher
*)lpParam;
    int
numeroPorte=(datiDispatcher.endPort)-(datiDispatcher.beginPort);//Numero
di porte da scansionare
    Scanner->ProgressBar1->Max=numeroPorte+1;
    Scanner->ProgressBar1->Step =1;
    Scanner->ProgressBar1->Position=0;
    int index=0;//Indice del thread da utilizzare per la scansione
    int threadnum=datiDispatcher.threadNum;
    usedThread =new unsigned char [threadnum];
    hThread1=new HANDLE [threadnum];
    dwThreadId1=new DWORD[threadnum];
    datiScan=new struct _DatiScan[threadnum];//=new struct _DatiScan;
    //Inizializzo i thread
    for (int t=0;t<threadnum;t++){
      hThread1[t]=NULL;
      dwThreadId1[t]=0;
      usedThread[t]=2;
    }
    Scanner->output->Clear();
    unsigned char flag=0;//False
    for(int
porta=datiDispatcher.beginPort;porta<=datiDispatcher.endPort;porta++){
        flag=0;
        for(;;){
           Sleep(1);
           for (int t=0;t<threadnum;t++){
              if(usedThread[t]!=1){//E' libero ma non de-allocato
                  if (usedThread[t]==0){//E' da de-allocare
                      CloseHandle(hThread1[t]);
                      Scanner->ProgressBar1->StepIt();
                      usedThread[t]=2;
                  }
                  index=t;
                  flag=1;
                  break;
              }
           }
           if(flag){
               break;
           }
        }//Fine for(;;)
         strcpy(datiScan[index].ipmacchina,datiDispatcher.ipmacchina);
         datiScan[index].port=porta;
         usedThread[index]=1;
         datiScan[index].used= &usedThread[index];
         hThread1[index]=
CreateThread(NULL,4096,Scan,(LPVOID)&datiScan[index]
,0,&(dwThreadId1[index]));
//        (index<threadnum)? index++:index=-1;
//        index=-1;
    }
    for(;;){
	    flag=0;
       Sleep(1);
       for (int t=0;t<threadnum;t++){
          if(usedThread[t]!=2){//E' libero ma non de-allocato
	          if (usedThread[t]==0){//E' da de-allocare
   	          CloseHandle(hThread1[t]);
                Scanner->ProgressBar1->StepIt();
                usedThread[t]=2;
             }
             flag=1;
          }
        }
        if(!flag){
            break;
        }
    }//Fine for(;;)
    Screen->Cursor=crDefault;
    return 0;
}
//---------------------------------------------------------------------------
DWORD WINAPI Scan( LPVOID lpParam )
{
    SOCKET s;
    struct sockaddr_in name;
    struct _DatiScan datiScan=*(struct _DatiScan*)lpParam;
    char buffer[256];
    int ret;
    s=socket (AF_INET,SOCK_STREAM,0);
//    setsockopt(s,IPPROTO_TCP,SO_RCVTIMEO,(const char FAR
*)datiScan.timeout,sizeof(int));
//    setsockopt(s,IPPROTO_TCP,SO_SNDTIMEO,(const char FAR
*)datiScan.timeout,sizeof(int));
    if (s!=INVALID_SOCKET){
      init_sockaddr_out(&name,datiScan.ipmacchina,(unsigned short
int)datiScan.port);
      ret=connect (s,(sockaddr FAR*)&name,sizeof(name));
      if(ret==0){
            /*
           Mando la stringa
           'GET 
http://www.yahoo.com
 HTTP/1.0[enter][enter]'
           e ricevo 'HTTP/1.0 200 OK' oppure 'HTTP/1.0 401 Unauthorized'
           */
         fd_set fds;
         int ishttp=0;
         int ndfs;
         FD_ZERO(&fds);
         FD_SET(s,&fds);
         timeval tv;
         tv.tv_sec=1;
         tv.tv_usec=0;
         ndfs=select(ndfs,&fds,NULL,NULL,&tv);
         if(ndfs==SOCKET_ERROR){
            ;
         }else{
            if(FD_ISSET(s,&fds)){
               /*Ci sono caratteri da leggere-> non e' una porta http*/
            }else{
               /*Ora invio la richiesta http*/
               char buffer[256];
               int num;
               strcpy(buffer,"GET 
http://www.yahoo.com
 HTTP/1.0\n\r\n");
               num=send(s,buffer,strlen(buffer),0);
               /*Controllo se c'e' la risposta*/
               FD_ZERO(&fds);
               FD_SET(s,&fds);
               tv.tv_sec=10;
               tv.tv_usec=0;
               ndfs=select(ndfs,&fds,NULL,NULL,&tv);
               if(ndfs!=SOCKET_ERROR){
                  if(FD_ISSET(s,&fds)){
                     num=recv(s,buffer,255,0);
                     buffer[num]=0;
                     /*Controllo se ho ricevuto una risposta http*/
                     if(strncmp(buffer,"HTTP",4)==0){
                        /*E' una connessione http*/
                        ishttp=1;
                        /*Controllo se e' ok*/
                     }
                     if(strstr(buffer,"OK")!=NULL){
                        /*E' una connessione http che esce*/
                        ishttp=2;
                        /*Controllo se e' ok*/
                     }
                  }
               }
               else{
                  // Non risponde
               }
            }
         }
         if(ishttp==0){
            sprintf(buffer,"APERTA %i",datiScan.port);
         }
         else if (ishttp==1){
            sprintf(buffer,"APERTA HTTP SU %i",datiScan.port);
         }
         else{
            sprintf(buffer,"APERTA HTTP OUT SU %i",datiScan.port);
         }
         Scanner->output->Lines->Append(buffer);
      }
      closesocket(s);
    }
/*
    else{
       sprintf(buffer,"apertura socket FALLITA %i",datiScan.port);
       Scanner->output->Lines->Append(buffer);
    }
*/
    *(datiScan.used)=0;
    return 0;
}
int ReadSocketln(SOCKET& s,char* buffer)
{
	char ch;
	int len,ret;
	len=0;
	for(;;){
		ret=recv(s,&ch,1,0);
		if (ret<=0){
		 buffer[0]=0;
		 break;
	}
	buffer[len]=ch;
	len++;
	if (ch=='\n'){
		buffer[len]=0;
		break;
	}
	}
	return strlen(buffer);
}
//---------------------------------------------------------------------------
void __fastcall TScanner::FormCreate(TObject *Sender)
{
    InitSocket();
}
//---------------------------------------------------------------------------
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Per il momento ho trovato solo questo!!!
[CUT]
Grazie mille...perchč Gaetano ha detto che non si puň?


 Grazie mille...perchč Gaetano ha detto che non si puň?
Nota che ha detto:   Borland Builder C++ e non ha specificato
la piattaforma.
Qui non si dovrebbe fare riferimento ne al compilatore ne
alla piattaforma.
PS. Una botta di tipi non c++ standard.
Ciao
Gaetano

 alla piattaforma.
Si, anche se quando si parla di g++ tutti sembrano non farci piu' caso.
Tommy


Perche' non e' il C++ che fa quanto scritto nel codice ma le librerie e le
API con le quali si linka.
Qui si parla solo di C++ standard, per le particolari librerie occorre
riferirsi ai gruppi a loro legati (oppure legati alla programmazione nel
sistema operativo in questione)
Ciao

 wrote in message
news:b76f2g$cf6$1...@sparta.btinternet.com...

Male, manco da un bel pezzo da questo NG e ora capisco perche'
la gente che c'era prima non c'e' piu'....   :-(
Ciao
Gaetano

 Grazie mille...perchč Gaetano ha detto che non si puň?
Prova a compilare il codice che hai avuto di esempio su linux...
Ciao,
Nicola
P.S. Se vuoi parlare di programmazione in ambiente Windows spostati
sul newsgroup it.comp.programmare.win32

Ragazzi mi pare che qui si stia esagerando, ormai sono sempre presente sulla
NG, e se posso esprimere la mia opinione non sopporto chi deve fare il
purista per forza
infine anke se si utilizzano librerie non direttamente implementate dal c++
il corpo del programma č scritto in c++ ed č giusto che un programmatore
cerki sempre il modo
piů efficace per scrivere il suo programma senza fermarsi troppo su problemi
di forma o di che sorta
                un saluto a tutta la NG
"Nicola Musatti" <Nicola....@ObjectWay.it> ha scritto nel messaggio
news:a327cf48.0304...@posting.google.com...


xxx
Mi fa piacere che ti 6 fatto vivo.
Grazie per il tuo Intervento.
P.S. Ragazzi, siate più UMANI!!!!!
II P.S. Se ho Detto Borland Builder c++, è inutile che mi chiedi se
funzionerebbe anche su Unix
   Windows.h  Winsock.h (WindowsSocket) .........
III P.S. Speriamo che il prossimo, risponda più concretamente
         (Senza essere tropo Pignolo!!!)


 Si, anche se quando si parla di g++ tutti sembrano non farci piu' caso.
Francamente non mi pare proprio ci sia maggiore tolleranza per gli OT
che parlano di gcc (o di Linux). Mentre noto, in genere, maggiore
ostinazione (ed arroganza, talvolta) da parte di utenti Windows, se
rimproverati per il carattere OT di una discussione.
Nota comunque che l'affermazione di Gaetano non è a rigori del tutto
esatta.
Il manifesto del gruppo contempla espressamente le discussioni sulla
conformità allo Standard di deteminati strumenti o il loro raffronto
in termini di prestazioni o funzionalità. Quindi, fare riferimento a
compilatori o piattaforme è ben possibile in determinati casi. Il caso
in questine non è uno di questi, però.
Max

          (Senza essere tropo Pignolo!!!)
Qui non si tratta di esser pignoli o pedanti.
La questione č che esistono newsgroup dedicati agli aspetti piů disparati
della programmazione in qualsiasi linguaggio e su qualsiasi piattaforma.
L'obiettivo sarebbe riferirsi al newsgroup piů adatto per la discussione che
si vuole tenere per il semplice motivo di trovare persone interessate a
quello di cui vuoi parlare.
Esiste un manifesto per ogni ng che si rispetti e andrebbe quanto meno
letto.
--
Domenico Testa - Studente

So perfettamente che il riferimanto al Builder, era più consono su:
it.comp.programmare.win32
In effetti hai ragione. Ciao!!!


 di forma o di che sorta
Ma sui problemi di educazione farebbe bene a soffermarsi,
possibilmente *prima* di mandare post fuori argomento.
Ciao,
Nicola