Ancora pascal...

vecchio1
dunque...di solito il pascal (o almeno per come lo so usare io) è un programma autonomo...mi spiego...quando metto in esecuzione il programma non interagisce col "mondo esterno" ma legge unicamente ciò che gli viene ordinato sul listato...
ora io ho la necessità di interagire con internet tramite Pascal..
il mio problema è questo..
mettiamo che io debba trovare una pagina così scritta:
www.vecchio123.it
ma che non sappia il numero associato al nome (123)...visto che non posso passare mezza giornata davanti ad IE per provare tutti i numeri consecutivi

www.vecchio1.it
www.vecchio2.it
...
www.vecchio123.it

avevo pensato di realizzare un programma che incrementasse da se' il numero dopo il nome e che si fermasse quando ricevesse da internet segnale positivo...è chiaro il mio problema? è possibile fare qualcosa del genere?
fatemi sapere
saluti

il vecchio

P.S.
se avete altre soluzioni che esulano dal Pascal sono bene accette cmq... [;)]


Risposte
eafkuor1
per windows speriamo che questo vada bene:

#include
#include

#define PORT 80


int client(char * server_IP);
int InitializeWinsock(WORD );


int main()
{
char string1[30], string2[10];
int n=0, c=0;

for(n=0;n<1000;n++){ //i tentativi si effettuano fino a www.vecchio1000.it

strcpy(string1, "www.vecchio");
sprintf(string2, "%i", n);
strcat(string1, string2);
strcat(string1, ".it");


//pero' forse devi convertire la stringa in ip non lo so come si fa mi dispiace
if (!InitializeWinsock (MAKEWORD(1,1) ) ) return 1;
if(!client(string1))continue;
else {WSACleanup();c=1;break;} //se ti connetti metti c=1 ed esci da ciclo
}
if(!c)printf("Non sono riuscito a collegarmi a nessun sito\n");
else printf("Mi sono collegato al sito %s\n", string1);


return 0;
}



int client(char * server_IP)
{
SOCKET fd; // "file" descriptor for the network socket
SOCKADDR_IN saddr;
//char buf[MAX_STRING]; questo non dovrebbe servire

if ((fd=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET){
printf("Errore durante la creazione del socket\n");
exit(0);
}
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(server_IP);
saddr.sin_port = htons(PORT);

if (connect(fd, (LPSOCKADDR) &saddr, sizeof(saddr)) == SOCKET_ERROR)
return 0; //se non si connette ritorna 0

if (closesocket(fd) == SOCKET_ERROR)
printf("Errore durante la chiusura del socket\n");

return 1;
}



int InitializeWinsock(WORD wVersionRequested)
{
WSADATA wsaData;
int err;

err = WSAStartup(wVersionRequested, &wsaData);


if (err!=0) return 0; // Tell the user that we couldn't find a usable winsock.dll


if (LOBYTE(wsaData.wVersion )!=1 || HIBYTE(wsaData.wVersion)!=1) return 0;


return 1;
}





-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen

vecchio1
ok direi che ci siamo!!! il compilatore non mi dà più errori...a questo punto dovrei dire "run" giusto? perfetto...e i risulti del programma deve li leggo??? quando gli dico "run" lui me lo compila dicendomi che non ci sono errori..e poi mi apre una finestra dal titolo: "compiler and linker output" in cui è scritto questo:

C:\DOCUME~1\...IMPOST~1\Temp\ccMbcaaa.o(.text+0x151):forse.cpp: undefined reference to `WSACleanup@0'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x238):forse.cpp: undefined reference to `socket@12'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x275):forse.cpp: undefined reference to `inet_addr@4'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x287):forse.cpp: undefined reference to `htons@4'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x2a2):forse.cpp: undefined reference to `connect@12'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x2bc):forse.cpp: undefined reference to `closesocket@4'
C:\DOCUME~1\...\IMPOST~1\Temp\ccMbcaaa.o(.text+0x308):forse.cpp: undefined reference to `WSAStartup@8'

che devo fare??


eafkuor1
allora il programma appena riesce a collegarsi a un sito smette di funzionare e ti dice a quale sito si e' collegato, se vuoi che continui a provare tutti i siti e che salvi in un file quelli a cui si e' collegato dimmelo.

questi errori vogliono dire che non trove quelle funzioni, che dovrebbero stare su una libreria esterna. probabilmente questa libreria non c'e' e la devi scaricare. leggendo il link che mi hai riportato tu qualche post fa, vedo:

1.1 Windows e i Sockets

Il progetto Windows Socket iniziò nell'ottobre 1991 in una sessione di Interdrop; venne quindi rilasciata la versione 1.0 in dicembre. E' successivamente seguita la versione 1.1 e l'attuale 2.0. Pur mantenendo le caratteristiche di base della definizione BSD, la specifica WinSock differisce in parecchi punti. I principali argomenti di divergenza sono i seguenti:
[...]
Non è quindi possibile ricompilare un programma UNIX in ambiente Windows senza effettuare una serie di modifiche per renderlo compatibile al nuovo ambiente.

[...]

Vengono riportati alcuni esempi commentati relativi all'impiego di sockets. Gli esempi sono sia per l'ambiente UNIX (con chiamate BSD standard), sia per l'ambiente Windows (Winsock). Per la compilazione degli stessi:

* UNIX: è normalmente sufficiente lanciare il comando gcc source_file.c -o exe_file

* Windows: è necessario creare un progetto (ad esempio con Visual C++), aggiungendo all'elenco delle librerie da linkare al programma la libreria winsock (ad esempio il file wsock32.lib per i sockets versione 1.1)[/br]


penso che tu debba scaricarti i socket versione 2.0 o 1.1 (cioe' ne sono sicuro). il fatto di cui sono un po' meno sicuro e' se tu debba avere o no per forza il compilatore Visual C++
fammi sapere se trovi questi socket


-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen

vecchio1
il problema è che non ho idea di dove trovarli!!...nè di dove metterli alla fine!!
cmq ho trovato intanto un altro link:
http://online.infomedia.it/riviste/logi ... ticolo.htm
forse può essere interessante (per te...visto che io non ci capsco nulla!!)

...continuo a cercare...
grazie per la pazienza...


vecchio1
che significa poi:

quote:

aggiungendo all'elenco delle librerie da linkare al programma la libreria winsock (ad esempio il file wsock32.lib per i sockets versione 1.1

?? bisogna fare qlcs tipo "#include..."?? boh..


vecchio1
io nella cartella "lib" di dev-c++ ho il file chiamato wsock32.def c'entra niente?? però non ha un'estensione *.lib...


eafkuor1
ho compilato il programma (con visual c++, bisogna includere wsock32.lib tra i file da linkare)
appena trova un sito funzionante lo scrive e smette di funzionare.
posso spedirti l' eseguibile per email.
ti posto il sorgente, giusto per curiosita'.


#include
#include
#include

#define PORT 80


int client(char * server_IP);
int InitializeWinsock(WORD );


int main()
{
char string1[30], string2[10], prima[20], seconda[20];
int n=0, c=0, fino, da;

printf("Inserire la prima parte del sito (per es www.sito): ");
scanf("%s", prima);
printf("Da che numero vuoi partire? ");
scanf("%d", &da);
printf("A che numero vuoi arrivare? ");
scanf("%d", &fino);
printf("Inserire la seconda parte del sito(per es .it): ");
scanf("%s", seconda);


for(n=da;n<=fino;n++){ //i tentativi si effettuano fino a www.vecchio1000.it

strcpy(string1, prima);
sprintf(string2, "%i", n);
strcat(string1, string2);
strcat(string1, seconda);
//printf("%s\n", string1);


//pero' forse devi convertire la stringa in ip non lo so come si fa mi dispiace
if (!InitializeWinsock (MAKEWORD(1,1) ) ) return 1;
if(!client(string1))continue;
else {WSACleanup();c=1;break;} //se ti connetti metti c=1 ed esci da ciclo
}
if(!c)printf("Non sono riuscito a collegarmi a nessun sito\n");
else printf("Mi sono collegato al sito %s\n", string1);

system("PAUSE");
return 0;
}



int client(char * server_IP)
{
SOCKET fd; // "file" descriptor for the network socket
SOCKADDR_IN saddr;
//char buf[MAX_STRING]; questo non dovrebbe servire

if ((fd=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET){
printf("Errore durante la creazione del socket\n");
exit(0);


}


saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(server_IP);
saddr.sin_port = htons(PORT);


if (connect(fd, (LPSOCKADDR) &saddr, sizeof(saddr)) == SOCKET_ERROR)
return 0; //se non si connette ritorna 0

if (closesocket(fd) == SOCKET_ERROR)
printf("Errore durante la chiusura del socket\n");


return 1;
}





int InitializeWinsock(WORD wVersionRequested)
{
WSADATA wsaData;
int err;

err = WSAStartup(wVersionRequested, &wsaData);

if (err!=0) return 0;

if (LOBYTE(wsaData.wVersion )!=1 || HIBYTE(wsaData.wVersion)!=1) return 0;


return 1;
}

-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen

eafkuor1
p.s. spero che funzioni altrimenti non so cosa fare e sarai ocndannato a linux [:D]

-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen

vecchio1
anche stavolta mi dà 0 errori..ma il programma dove dovrei vederlo????? io gli dico "run" ma lui non mi fa apparire (ad esempio) la scritta "inserisci la prima parte del sito...etc..."
cmq ok per l'eseguibile!! ora ti do la mia e-mail..
spediscimi quest'ultimo in modo che io possa da solo modificare (immettere in questo caso) il link del sito..
grazie

il vecchio


vecchio1
ah ... dimenticavo...stanotte stavo pensando...(è raro...[;)])
visto che in Pascal posso anche scrivere delle unit (non sono assolutamente capace...ma in via del tutto teorica), potrei anche scrivere dei sockets per il Pascal...o no? e quindi potrei realizzare il programma in questione anche con il Pascal...no?
beh...questa è una delle cose mi piacerebbe saper fare e che mi riprometto di imparare un giorno...ma che come al solito non avrò il tempo di fare...[:(]

ciao ciao
il vecchio


eafkuor1
ti si dovrebbe aprire una console dos. cmq non mi chiedere come si fa in pascal perche' non lo conosco =)

-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.