Ciao a tutti!
Sono un po' di giorni che sto sbattendo la testa su un problema e non riesco a venirne a capo. Sto sviluppando un mail server multithread. Posto direttamente il codice (è molto lungo perciò ometterò alcune parti):
Il problema è che la recv spesso ritorna -1 e il fatto ancora più strano è che GetLastError() ritorna 0. A schermo infatti mi stampa "recv() failed: Operazione completata".codice://MultiThreadedServer.c static SOCKET POP3Socket = INVALID_SOCKET; static SOCKET SMTPSocket = INVALID_SOCKET; void MultiThreadedServer() { ... setWinSocket(); // Imposta i socket SMTP e POP3 while(TRUE){ hSMTP=(HANDLE)_beginthreadex(NULL,0,SMTPThrdConn,&tArgs[iThd+1],0,&SMTPThId); tStatus = WaitForSingleObject(hSMTP,INFINITE); if(tStatus==WAIT_OBJECT_0){ CloseHandle(hSMTP); } ... } static DWORD WINAPI SMTPThrdConn(SRV_PARAMS *tArgs) { ... tArgs->SMTPSocket=accept(SMTPSocket,...); tArgs->srv_hndl=(HANDLE)_beginthreadex (NULL, 0, SMTPCommands, tArgs, 0, &ThId); ... } // SMTPCommands.c void SMTPCommands(SRV_PARAMS *tArgs) { ... char *tmpStr=(char *)calloc(MAX_REQ_SIZE,sizeof(char)); while (!session->Done && !flagsGuard.ReReadCfg){ session->request=(char *)calloc(MAX_REQ_SIZE,sizeof(char)); do{ memset(tmpStr,0,sizeof(tmpStr)); iResult=recv(tArgs->SMTPSocket,tmpStr,sizeof(tmpStr)-1,0); if(iResult<0) PrintError("recv() failed:"); strcat(session->request,tmpStr); } while(strstr(tmpStr,"\n")==NULL); ... }
Provando a fare un debugging con gdb al momento dell'errore digito bt e mi ritorna:
Non riesco proprio a capire cos'è che non va.codice:#0 SMTPCommands (tArgs=0x28fddc) at SMTPCommands.c:35 [dove controllo che iResult<0] #1 0x77221287 in msvcrt!_itow_s () from C:\Windows\syswow64\msvcrt.dll #2 0x77221328 in msvcrt!_endthreadex () from C:\Windows\syswow64\msvcrt.dll #3 0x77123677 in KERNEL32!BasepMapModuleHandle () from C:\Windows\syswow64\kernel32.dll #4 0x005b3770 in ?? () #5 0x029bffd4 in ?? () #6 0x77969d72 in ntdll!RtlpNtMakeTemporaryKey () from C:\Windows\system32\ntdll.dll #7 0x005b3770 in ?? () #8 0x74145183 in ?? () #9 0x00000000 in ?? ()

Rispondi quotando
