| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  14-02-2010, 17:05 | #1 | 
| Senior Member Iscritto dal: Jan 2001 Città: Villanova di Guidonia (RM) 
					Messaggi: 1079
				 | 
				
				[C] Problema con recv()
			 
		Ciao a tutti! Sto sviluppando un mail server. Facendo la recv() su un socket, questa si comporta in modo strano. Questo è il codice della funzione (eseguita in un thread separato): Codice: void SMTPCommands(THRD_PARAMS *tArgs)
{
....
int iResult;
SMTPSession *session=(SMTPSession *)malloc(sizeof(SMTPSession));
memset(session->request,0,sizeof(session->request));
while (!flagsGuard.ShutDown){
		printf("Waiting for SMTP request...\n");
		iResult=recv(tArgs->SMTPSocket,session->request,MAX_REQ_SIZE,0); // MAX_REQ_SIZE = 512
....
				__________________ Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson | 
|   |   | 
|  14-02-2010, 17:53 | #2 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		iResult cosa contiene dopo ?
		 | 
|   |   | 
|  14-02-2010, 18:05 | #3 | 
| Senior Member Iscritto dal: Jan 2001 Città: Villanova di Guidonia (RM) 
					Messaggi: 1079
				 | 
		iResult ritorna 4 (cioè i caratteri di HELO). E alla successiva chiamata a recv iResult vale 2 (ossia \r\n). Le prove le sto facendo con PuTTy. 
				__________________ Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson | 
|   |   | 
|  14-02-2010, 18:10 | #4 | 
| Senior Member Iscritto dal: Jan 2001 Città: Villanova di Guidonia (RM) 
					Messaggi: 1079
				 | 
		Un'altra cosa strana sempre relativa a questo comportamento è che quando vado ad analizzare il codice con gdb, metto un breakpoint sulla riga della recv(). A quel punto se prima di digitare step su gdb immetto il comando da telnet e solo dopo digito step su gdb, allora in quel caso la recv() torna correttamente HELO\r\n.    
				__________________ Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson | 
|   |   | 
|  15-02-2010, 01:38 | #5 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Prima di tutto ti consiglio di fare una recv non bloccante. Non hai garanzia che la RECV ti torni tutti i dati disponibili. Sapendo che nel tuo protocollo un comando deve finire con /r/n, se non trovi questi dati in fondo al comando allora continua a leggere. | 
|   |   | 
|  15-02-2010, 12:14 | #6 | 
| Senior Member Iscritto dal: Jan 2001 Città: Villanova di Guidonia (RM) 
					Messaggi: 1079
				 | 
		Grazie mille. Questa è una soluzione più elegante rispetto a quella che avevo trovato prima e cioè fare 2 recv una di seguito all'altra.
		 
				__________________ Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 17:22.









 
		 
		 
		 
		







 
  
 



 
                        
                        










