|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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 |
|
|
|
|
|
#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 ?
|
|
|
|
|
|
#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 |
|
|
|
|
|
#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 |
|
|
|
|
|
#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. |
|
|
|
|
|
#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: 12:52.



















