Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    11

    [C][SOCKET] programma comunicazione POP3

    Ciao a tutti.

    Sto scrivendo un programma in C che mi permetta di comunicare con un server POP3 con il fine di ottenere il numero di E-mail presenti su quest'ultimo. Visto che sono alle prime armi mi sono limitato a testare per lo meno la gestione dei messaggi con il server POP3 in particolare cerco di autenticarmi con i comandi "user ..." e "pass ...".
    Il problema è che quando invio il comando "user <mio nome utente>" il server mi restituisce la stringa "-ERR Protocol error."

    Vi posto il codice:
    codice:
    #include <sys/types.h>   /* predefined types */
    #include <unistd.h>      /* include unix standard library */
    #include <arpa/inet.h>   /* IP addresses conversion utilites */
    #include <sys/socket.h>  /* socket library */
    #include <stdio.h>	 /* include standard I/O library */
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    
    void ComPop3(FILE * filein, int socket);
    
    /* Variables and costants definition */
        #define MAXLINE 256
        int sock_fd, i;
        struct sockaddr_in serv_add;
    
    /* Main program begin */
    int main(int argc, char *argv[])
    {
        /* create socket */
        if ( (sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    	perror("Socket creation error");
    	return 1;
        }
        /* initialize address */
        memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */
        serv_add.sin_family = AF_INET;                   /* address type is INET */
        serv_add.sin_port = htons(110);                    /* 110 da pop3 protocol */
        /* build address using inet_pton */
        if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) { /* ottengo l'indirizzo del server, che viene fornito come argomento */
    	perror("Address creation error");				/* Il server deve essere in formato dotted decimal */
    	return 1;
        }
        /* extablish connection */
        if (connect(sock_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) {
    	perror("Connection error");
    	return 1;
        }
        /* avvia funzione di comunicazione con il server */
        ComPop3(stdin, sock_fd);	
        return 0;
    }
    
    /* funzione di comunicazione con il server */
    void ComPop3(FILE * filein, int socket) 
    {
        /* Local variables definition */
        char sendbuff[MAXLINE+1], recvbuff[MAXLINE+1];
        int nread,nwrite; 
        nread = read(socket, recvbuff, sizeof(recvbuff)); //sizeof: per leggere fino alla fine
        recvbuff[nread] = 0;
        fputs(recvbuff, stdout);
        
        fgets(sendbuff, MAXLINE, filein);
        nwrite= send(socket, sendbuff, strlen(sendbuff), 0);   
        if (nwrite < 0) {
            fputs("errore nella trasmissione\n", stdout);
        }
        if (nwrite == 0) {
            fputs("messaggio vuoto\n", stdout);
        }
        if (nwrite > 0) {
            fputs("inviato messaggio\n", stdout);
        }    
       
        nread= recv(socket, recvbuff, sizeof(recvbuff), 0);
        recvbuff[nread] = 0;
        fputs(recvbuff, stdout);
    }
    La parte che sicuramente necessita di qualche correzione è la segiente:

    codice:
    /* funzione di comunicazione con il server */
    void ComPop3(FILE * filein, int socket) 
    {
        /* Local variables definition */
        char sendbuff[MAXLINE+1], recvbuff[MAXLINE+1];
        int nread,nwrite; 
        nread = read(socket, recvbuff, sizeof(recvbuff)); //sizeof: per leggere fino alla fine
        recvbuff[nread] = 0;
        fputs(recvbuff, stdout);
        
        fgets(sendbuff, MAXLINE, filein);
        nwrite= send(socket, sendbuff, strlen(sendbuff), 0);   
        if (nwrite < 0) {
            fputs("errore nella trasmissione\n", stdout);
        }
        if (nwrite == 0) {
            fputs("messaggio vuoto\n", stdout);
        }
        if (nwrite > 0) {
            fputs("inviato messaggio\n", stdout);
        }    
       
        nread= recv(socket, recvbuff, sizeof(recvbuff), 0);
        recvbuff[nread] = 0;
        fputs(recvbuff, stdout);
    }
    Sapete dirmi cosa sbaglio? Ho letto sulle specifiche del protocollo POP3 che ogni comunicazione da client a server deve terminare con \n\r, ma come faccio a inserirlo?

  2. #2
    A parte che mi sembra proprio che sia \r\n e non \n\r.

    comunque puoi usare la

    Codice PHP:
    strcat() 
    oppure
    Codice PHP:
    sprintf(new_string_ptr."%s\r\n",old_string_ptr). 

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    11
    Dopo mille peripezie, ieri sera, sono riuscito a risolvere il problema con questo codice:

    codice:
    temp=strchr(sendbuff,'\n');  //restituisce il puntatore al carattere cercato e NULL se non lo trova
    if (temp)
         temp[0]='\0';   //sostituisco il carattere, ma sendbuff continua a contenere il comando digitato
    Comunque, questa sera appena torno a casa dal lavoro provo anche il tuo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.