Oppure

Loading
06/06/10 16:49
gabriele94
ciao ragazi..complimenti per il sito super efficente. Volevo chiedervi un aiuto.
Ho fatto una funzione in c che mi invia le email(ho appena inziato a studiare le socket)..ci sono riuscito pero c'è un problema.. Invio l'email, dopo di che se lo eseguo nuovamente non l'inavia piu. Perche? vi posto il codice
#include <stdio.h>              //Input/output Standard (es:printf()…)
#include <stdlib.h>
#include <winsock.h>            //API winsock
#include <windows.h>

typedef char stringa[500];


WSADATA data;                                //La struttura WSADATA contiene informazioni sull’implementazione
                                             //delle socket windows

WORD versione;                               //preparo la variabile che tiene la versione di socket windows che il chiamante può usare.


SOCKET conn;                                 //Creare un elemento di tipo socket chiamato conn:
       
FILE *fmail;                                 //creo un puntatore al file

char buf[1500];                              //variabile dove vado ad inserire temporaneamente destinatario,mittente, oggetto che poi immetto nell'email


int err=0;

char end[7];
char input;
char mess[1000];
int n=0;
                                                

LPHOSTENT host;                                       //restituisce una struttura di tipo "hostent" in cui mette
                                                      //l'indirizzo IP. Riceve in ingresso il nome dell'host che puo' essere
                                                      //un nome, in indirizzo IPv4 o un indirizzo IPv6.
                                                      //Nel caso di IPv4 o IPv6, il campo "indirizzo_host->h_addr" contiene il nome stesso.
                                                      //indirizzo_host=gethostbyname("nome.inventato.it");
                                                      //Se hp contiene il puntatore nullo, allora la chiamata a gethostbyname e' fallita.




char Mittente[50]="provai@hotmail.it";         //imposto il mittente
char Destinatario[50]="alauraXX@gmail.com";      //imposto il destinatario
char Oggetto[50]="email";                        //imposto l'ogetto del messaggio


main()
{

     fmail=fopen("testo.txt","r");               //controllo se esiste il file e se ho i permessi per aprirlo
	 if (fmail==NULL){
		 printf("file esiste");                  //se qualcosa va storto esco
		}

     versione=MAKEWORD(2,0);                    //versione di socket windows che il chiamante può usare.
     
     WSAStartup(versione,&data);                 //specifica il numero di versione di winsock sul
                                                 //sistema e lo costruisce correttamente


     int lun;                                     //conterra il numero che indica la lunghezza della struttura della socket
                                                 
	 conn=socket(PF_INET,SOCK_STREAM,0);         //Crea una socket dedicata ad un fornitore di servizi specifico
	                                             
                                            //Tipo: PF_INET , descrizione:      
                                                 //In questo esempio la funzione
                                                 //usa l’internet address family,
                                                 //con socket di tipo stream e
                                                 //protocollo TCP/IP (? “0”) 
                                                 
                                                     
                                           //Tipo: SOCK_STREAM, descrizione:      
                                                 //Fornisce una connessione sequenziale,
                                                 //affidabile e full-duplex. Il protocollo TCP
                                                 //è basato su questo tipo di socket.
	 
     SOCKADDR_IN conn_addr;                           //creo la struttura della socket (sockaddr)
     conn_addr.sin_family=PF_INET;                    //Forma di sockaddr In AF_INET poiche utilizziamo il protocollo ip
                                                      //ip v4 
	 conn_addr.sin_port=htons(25);                    //assegnando la porta 25

	 host=gethostbyname ("mail.tin.it");              //prendo l'indirizzo ip di mail.tin.it
	 
	 if (host==NULL)                                  //controllo se l'ip e valido altrimenti esco
		printf("host ok");

	 conn_addr.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
     lun=sizeof(struct sockaddr);                     //prendo la lunghezza della socket per poi passarla alla funzione creazione

     err=connect(conn,(struct sockaddr*)&conn_addr,lun);   //Chiamo la funzione connect () passando come parametri la socket
                                                           //creata e settata all’ascolto e la struttura sockaddr_in. 
                                                           
                                                           
     if (err!=0)                                           //Verifico la presenza di errori
     {
		err=WSAGetLastError();
		printf("Errore della Socket\t%d",err);
     }

    char mess[1000];                                           //dichiaro variabile dove salvero i messaggi del server
	
	n=recv(conn,mess,200,0);
	mess[n]=0;
	printf(mess,"%s");


    sprintf(buf, "helo inviamail\nmail from:<send@email.it>\nrcpt to:<%s>\ndata\n",Destinatario);
    send(conn, buf, strlen(buf), 0);    
    
    printf(buf);
    sprintf(buf, "From: %s\n",Mittente);
    send(conn, buf, strlen(buf), 0);

    sprintf(buf, "To: %s\n",Destinatario);
    send(conn, buf, strlen(buf), 0);

    sprintf(buf, "Subject: %s\n",Oggetto);
    send(conn, buf, strlen(buf), 0);


	while (feof(fmail)==0){
		fscanf (fmail,"%c",&input);
		send (conn,&input,1,0);
                   }

    sprintf(buf, "\n.\n");
    printf(buf);
    send(conn, buf, strlen(buf), 0);

	fclose(fmail);


	sprintf(end,"quit\n");
	send(conn,end,strlen(end),0);




	
	n=recv(conn,mess,200,0);
	mess[n]=0;
	printf(mess,"%s");


  closesocket(conn);                                          //chiude la socket (chiude la connessione)


WSACleanup();
system("del log.txt");
}

aaa
06/06/10 17:11
gabriele94
Ho capito un po il funzionamento e praticamente se avvio il programma per la rima volta lo esegue (tutte le istruzioni) fino alla cancellazione del file e funziona perfettamente, poi quando provo a riavviarlo mi si blocca il programma non dando piu segni di vita..
Ho ceracto qualkosa che ho dimenticato a chidere (file, socket) ma non mi sembra abbia dimenticato niente.. Ho provato ad inserire exit(EXIT_SUCCESS); per terminarlo piu corretamente ma nulla..Mi dareste un aiuto..
aaa
06/06/10 20:23
nessuno
Quando lo esegui la seconda volta, hai fatto un po' di debugging per capire quale funzione restituisce errore?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
07/06/10 12:59
gabriele94
risolto :k:
ne approfitto della vostra gentilezza per chiedervi una cosa.. Come posso fare a prendere il patch di dove si trova il mio eseguibile?
Io ho fatto un programmino dove e possibile scrivere un messaggio e viene codificato e salvato su un file di .txt. Sempre questo eseguibile dovrebbe riuscire a prendere il percorso dove si trova es C: , aggiungere il nome dell'altro eseguibile invio.exe e passarlo alla funzione system..
Io con le conoscenze che ho vorrei farlo cosi ma se voi conoscete altre funzioni che semplifichino la vita saranno bene accette:)
aaa
07/06/10 13:13
nessuno
Postato originariamente da gabriele94:

risolto :k:
ne approfitto della vostra gentilezza per chiedervi una cosa.. Come posso fare a prendere il patch di dove si trova il mio eseguibile?


No patch ! Ma path ...

Il path è contenuto nel primo argomento passato al main

argv[0]
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
07/06/10 13:26
gabriele94
patch 8-| path:D cmq ancora non sono molto pratico non ho afferrato bene il concetto..
Io nel codice ho
main()
{
}
se è un argomento del main come lo passo ad una variabile es char posizione?
aaa
07/06/10 13:26
gabriele94
Ho letto che:
argv[0] e' il nome del programma ed e' sempre presente.
ma a me non interessa il nome del programma..interessa la directory dove viene mandato in esecuzione... Sono un po confuso :alert:
Ultima modifica effettuata da gabriele94 07/06/10 13:52
aaa
07/06/10 13:58
gabriele94
SEI UN GRANDE!!!
L'ho capito adesso facendomi un programmino stupido ma efficace

#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char *nome;
nome=argv[0];
printf("%s",nome);
system("pause";);
}

:k::k::k::k:
Grazie

Ma alla funzione system non posso passare una stringa?
system("%s",percorso);
???

Ultima modifica effettuata da gabriele94 07/06/10 14:03
aaa