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?