|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2003
Città: Verona
Messaggi: 252
|
[C] Problema con programmazione socket
Ciao a tutti,
Ho implementato un sistema di cosimulazione tra due programmi che si parlano via socket. Da un lato ho QEMU, una macchina virtuale tipo VMWARE, dall'altra ho un descrizione di una semplice memoria in SystemC. Per far parlare tra di loro come ho detto utilizzo i socket. Il problema è che, non sempre, la funzione recv mi dà errore (ritorna -1) e non so dove sbatterci la testa. C'è un qualche modo (log, altro...) che mi permetta di capire perchè qualche volta la connessione va male? Uso un sistema operativo linux con kernel aggiornato a 2.6.16 Grazie Alessandro ps: ho provato a comunicare con systemC con un altro programmino e funziona alla grande... e i parametri sono gli stessi identici
__________________
HP DV5-1170EL HTC TYTN WM6 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
controlla la variabile "errno"
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2003
Città: Verona
Messaggi: 252
|
Grazie per il suggerimento,
Infatti il problema è che errno ritorna EINTR. Da quel poco che sono riuscito a documentarmi è a causa di un segnale che va ad interrompere la recv. C'è un modo per gestire questo "errore"? cioè fare in modo che questo segnale non vada a rompere le scatole al socket? Grazie mille! EDIT: pardon ma l'ora è tarda e i ragionamenti tardano ad arrivare... Allora... guardando netstat quando la connessione è stabilita all'inizio il risultato è ESTABILISHED, se invece qualcosa va male invece ritrovo CLOSE_WAIT. Anticipando che io non posso mettere le mani sul "server" se non riavviandolo (quindi non posso gestire il socket direttamente) posso fare qualcosa per riassettare il client?
__________________
HP DV5-1170EL HTC TYTN WM6 Ultima modifica di alessc : 13-09-2006 alle 02:03. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
Quote:
ciao! |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Sep 2003
Città: Verona
Messaggi: 252
|
Già fatto,
adesso il problema è come gestirlo questo errore... ci ho pensato / cercato tutto ieri e non sono riuscito a trovare niente! Help!
__________________
HP DV5-1170EL HTC TYTN WM6 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
EINTR non è un errore; è la segnalazione fatta alle chiamate bloccanti (come recv) che il programma ha ricevuto un segnale. Forse il tuo programma usa segnali, o tu direttamente o indirettamente tramite qualche funzione (ad es. alarm).
La soluzione è semplice: ripetere la syscall esattamente come la hai effettuata. Ad es: Codice:
do {
sz = recv(sock, buf, len, flags);
} while(sz<0 && errno==EINTR);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Sep 2003
Città: Verona
Messaggi: 252
|
Funtiona alla grande!
In verità avevo già provato ma non ho messo la condizione "sz < 1", ho messo solo errno == EINTR. Grazie mille!
__________________
HP DV5-1170EL HTC TYTN WM6 |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
sz==0 sulla recv indica, sui socket tcp, una condizione di EOF (disconnessione).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Sep 2003
Città: Verona
Messaggi: 252
|
Hai ragione, scusa... ho sbagliato a scrivere... intendevo 0
Grazie!
__________________
HP DV5-1170EL HTC TYTN WM6 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:59.



















