Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Inspiegabile core dump del client
Forum - C/C++ - Inspiegabile core dump del client

Avatar
ulysses (Normal User)
Newbie


Messaggi: 16
Iscritto: 30/01/2012

Segnala al moderatore
Postato alle 11:31
Mercoledì, 12/09/2012
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...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4. #include <netinet/in.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <netdb.h>
  8. #include "errori.h"
  9. #include <unistd.h>
  10.  
  11. int send_b(int socket, char *buffer){
  12.        
  13.         int sb, bts;
  14.         bts = strlen(buffer);
  15.         while(bts > 0){
  16.                 sb = send(socket, buffer, bts, 0);
  17.                 if(sb == 0)
  18.                         return 1; // Ciclo finito
  19.                 bts -= sb;
  20.                 buffer += sb;
  21.         }
  22.         return 0;
  23. }
  24.  
  25. int main(){
  26.         int sock;
  27.         struct sockaddr_in sock_h;
  28.         struct hostent *host;
  29.        
  30.         host = gethostbyname("smtp.gmail.com");
  31.         //Creo socket
  32.         if( (sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  33.                 serrore("Creazione socket fallita.", sock);
  34.         //Connessione
  35.        
  36.         sock_h.sin_family = AF_INET;
  37.         sock_h.sin_port = htons(587);
  38.         sock_h.sin_addr = *(struct in_addr *)host->h_addr;
  39.        
  40.         printf("Connessione in corso...");
  41.        
  42.         if( connect(sock, (struct sockaddr *)&sock_h, sizeof(struct sockaddr) ) == -1)
  43.                 serrore("Connessione socket fallita.", sock);
  44.         printf("CONNESSO\n");
  45.         //Invio messaggi
  46.         char *rsp = (char*)malloc(1024);
  47.         int x;
  48.         while (1){
  49.                 x = recv(sock, rsp, 10000, 0);
  50.                 if(x == 0 || x == -1)
  51.                         serrore("Ricezione fallita. Chiusura.", sock);
  52.                 printf("\nSERVER #=> %s\n\n", rsp);
  53.                 char *msg = (char *)malloc(1024);
  54.                 printf("CLIENT #=> ");
  55.                 fgets(msg, 1024, stdin);
  56.        
  57.                 send_b(sock, msg);
  58.                
  59.                 free(msg);
  60.                 free(rsp);
  61.                
  62.         }
  63.        
  64.         shutdown(sock, 2);
  65.         return 0;
  66. }



(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...

Codice sorgente - presumibilmente C/C++

  1. Connessione in corso...CONNESSO
  2.  
  3. SERVER #=> 220 mx.google.com ESMTP w7sm7203886wiz.0
  4.  
  5.  
  6. CLIENT #=> helo
  7.  
  8. SERVER #=> 250 mx.google.com at your service
  9. wiz.0
  10.  
  11.  
  12. CLIENT #=> mail from <ulysses.diamadis@gmail.com>
  13. *** glibc detected *** ./gclient: double free or corruption (top): 0x09ff07b8 ***
  14. ======= Backtrace: =========
  15. /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb75ebe42]
  16. ./gclient[0x80488c6]
  17. /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75914d3]
  18. ./gclient[0x80485b1]
  19. ======= Memory map: ========
  20. 08048000-08049000 r-xp 00000000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
  21. 08049000-0804a000 r--p 00000000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
  22. 0804a000-0804b000 rw-p 00001000 08:07 8388723    /home/ulysses/Documenti/Progetti/Prove/gclient
  23. 09fef000-0a010000 rw-p 00000000 00:00 0          [heap]
  24. b7518000-b7534000 r-xp 00000000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
  25. b7534000-b7535000 r--p 0001b000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
  26. b7535000-b7536000 rw-p 0001c000 08:07 4719540    /lib/i386-linux-gnu/libgcc_s.so.1
  27. b7547000-b755a000 r-xp 00000000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
  28. b755a000-b755b000 ---p 00013000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
  29. b755b000-b755c000 r--p 00013000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
  30. b755c000-b755d000 rw-p 00014000 08:07 4719603    /lib/i386-linux-gnu/libresolv-2.15.so
  31. b755d000-b755f000 rw-p 00000000 00:00 0
  32. b755f000-b7564000 r-xp 00000000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
  33. b7564000-b7565000 r--p 00004000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
  34. b7565000-b7566000 rw-p 00005000 08:07 4719568    /lib/i386-linux-gnu/libnss_dns-2.15.so
  35. b7566000-b7568000 r-xp 00000000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
  36. b7568000-b7569000 r--p 00001000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
  37. b7569000-b756a000 rw-p 00002000 08:07 4718647    /lib/libnss_mdns4_minimal.so.2
  38. b756a000-b7575000 r-xp 00000000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
  39. b7575000-b7576000 r--p 0000a000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
  40. b7576000-b7577000 rw-p 0000b000 08:07 4719570    /lib/i386-linux-gnu/libnss_files-2.15.so
  41. b7577000-b7578000 rw-p 00000000 00:00 0
  42. b7578000-b7717000 r-xp 00000000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
  43. b7717000-b7719000 r--p 0019f000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
  44. b7719000-b771a000 rw-p 001a1000 08:07 4719519    /lib/i386-linux-gnu/libc-2.15.so
  45. b771a000-b771d000 rw-p 00000000 00:00 0
  46. b772b000-b7730000 rw-p 00000000 00:00 0
  47. b7730000-b7731000 r-xp 00000000 00:00 0          [vdso]
  48. b7731000-b7751000 r-xp 00000000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
  49. b7751000-b7752000 r--p 0001f000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
  50. b7752000-b7753000 rw-p 00020000 08:07 4719499    /lib/i386-linux-gnu/ld-2.15.so
  51. bfe1c000-bfe3d000 rw-p 00000000 00:00 0          [stack]
  52. Aborted (core dumped)



PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:00
Mercoledì, 12/09/2012
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

http://www.iprogrammatori.it/forum-programmazione/cplusplu ...

... e quello funzionava ...

Ultima modifica effettuata da nessuno il 12/09/2012 alle 13:32


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à.
PM Quote
Avatar
ulysses (Normal User)
Newbie


Messaggi: 16
Iscritto: 30/01/2012

Segnala al moderatore
Postato alle 13:32
Mercoledì, 12/09/2012
Ho imparato la lezione. Mai programmare appena svegliati.
Grazie mille :)

PM Quote