Oppure

Loading
12/09/12 9:31
ulysses
Ho fatto un client che scambia messaggi con un server (tipo telnet, insomma, un client molto semplice) e quando comunico con smtp.gmail.com, se gli scrivo il comando "Mail from <mioindirizzodiposta>", il client mi restituisce un errore alquanto strano. Credo di aver fatto casino con qualche puntatore (non sono abile a maneggiarli :D)

Eccovi il codice del client...

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include "errori.h"
#include <unistd.h>

int send_b(int socket, char *buffer){
	
	int sb, bts;
	bts = strlen(buffer);
	while(bts > 0){
		sb = send(socket, buffer, bts, 0);
		if(sb == 0)
			return 1; // Ciclo finito
		bts -= sb;
		buffer += sb;
	}
	return 0;
}

int main(){
	int sock;
	struct sockaddr_in sock_h;
	struct hostent *host;
	
	host = gethostbyname("smtp.gmail.com");
	//Creo socket
	if( (sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		serrore("Creazione socket fallita.", sock);
	//Connessione
	
	sock_h.sin_family = AF_INET;
	sock_h.sin_port = htons(587);
	sock_h.sin_addr = *(struct in_addr *)host->h_addr;
	
	printf("Connessione in corso...");
	
	if( connect(sock, (struct sockaddr *)&sock_h, sizeof(struct sockaddr) ) == -1)
		serrore("Connessione socket fallita.", sock);
	printf("CONNESSO\n");
	//Invio messaggi
	char *rsp = (char*)malloc(1024);
	int x;
	while (1){
		x = recv(sock, rsp, 10000, 0);
		if(x == 0 || x == -1)
			serrore("Ricezione fallita. Chiusura.", sock);
		printf("\nSERVER #=> %s\n\n", rsp);
		char *msg = (char *)malloc(1024);
		printf("CLIENT #=> ");
		fgets(msg, 1024, stdin);
	
		send_b(sock, msg);
		
		free(msg);
		free(rsp);
		
	}
	
	shutdown(sock, 2);
	return 0;
}


(errori.h è una mia libreria per gestire rapidamente gli errori, non credo abbia nulla a che fare con l'errore)

Ed ecco in atto la comunicazione tra me e gmail...

Connessione in corso...CONNESSO

SERVER #=> 220 mx.google.com ESMTP w7sm7203886wiz.0


CLIENT #=> helo

SERVER #=> 250 mx.google.com at your service
wiz.0


CLIENT #=> mail from <ulysses.diamadis@gmail.com>
*** glibc detected *** ./gclient: double free or corruption (top): 0x09ff07b8 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb75ebe42]
./gclient[0x80488c6]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75914d3]
./gclient[0x80485b1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
08049000-0804a000 r--p 00000000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
0804a000-0804b000 rw-p 00001000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
09fef000-0a010000 rw-p 00000000 00:00 0          [heap]
b7518000-b7534000 r-xp 00000000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
b7534000-b7535000 r--p 0001b000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
b7535000-b7536000 rw-p 0001c000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
b7547000-b755a000 r-xp 00000000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
b755a000-b755b000 ---p 00013000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
b755b000-b755c000 r--p 00013000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
b755c000-b755d000 rw-p 00014000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
b755d000-b755f000 rw-p 00000000 00:00 0 
b755f000-b7564000 r-xp 00000000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
b7564000-b7565000 r--p 00004000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
b7565000-b7566000 rw-p 00005000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
b7566000-b7568000 r-xp 00000000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
b7568000-b7569000 r--p 00001000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
b7569000-b756a000 rw-p 00002000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
b756a000-b7575000 r-xp 00000000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
b7575000-b7576000 r--p 0000a000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
b7576000-b7577000 rw-p 0000b000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
b7577000-b7578000 rw-p 00000000 00:00 0 
b7578000-b7717000 r-xp 00000000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
b7717000-b7719000 r--p 0019f000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
b7719000-b771a000 rw-p 001a1000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
b771a000-b771d000 rw-p 00000000 00:00 0 
b772b000-b7730000 rw-p 00000000 00:00 0 
b7730000-b7731000 r-xp 00000000 00:00 0          [vdso]
b7731000-b7751000 r-xp 00000000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
b7751000-b7752000 r--p 0001f000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
b7752000-b7753000 rw-p 00020000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
bfe1c000-bfe3d000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)

aaa
12/09/12 11:00
E' ovvio che succeda ... hai inserito la

free(rsp);

nel ciclo ...

E inoltre, hai allocato il buffer con 1024 caratteri e nella recv indichi una lunghezza di 10000 caratteri.

Il problema è che hai modificato in maniera sbagliata il codice d'esempio che altri ti hanno suggerito in

iprogrammatori.it/forum-programmazione/cplusplus/…

... e quello funzionava ...
Ultima modifica effettuata da 12/09/12 11:32
12/09/12 11:32
ulysses
Ho imparato la lezione. Mai programmare appena svegliati.
Grazie mille :)
aaa