luppolo
08-12-2007, 13:40
Ciao ragazzi,
ormai non ricordo più da quanto sto sbattendo la testa su questo applicativo...
devo semplicemente creare 2 applicativi (sotto linux) il primo che crea dei socket tcp dai quali spedisco pacchetti, il secondo che riceve questi pacchetti e li ridirige a seconda del tipo di pacchetto che arriva.
funziona praticamente tutto, il problema pero' è che il socket che riceve i pacchetti di tanto in tanto diventa lentissimo a leggere (cioè passa da 10/20 millisecondi a 1/2 secondi per la lettura di un intero pacchetto di circa 2000byte!!!).
Di questo sono abbastanza sicuro... nel senso che ho fatto centinaia di controlli, e posso affermare con certezza che il problema SICURAMENTE non risiede ne nell'applicativo che spedisce i dati, e nemmeno risiede nel pezzo di codice che effettua le write dell'applicativo che legge i dati...
un'altra cosa un po' anomala, è che il problema a volte si presenta da subito... a volte non si presenta... altre volte funziona per un po' e poi inizia a rallentare.....
ho ridotto all'osso il codice, provando ad usare un solo socket ... ma niente...
sembra una maledizione + che un errore...
riuscite a darci un occhio? io l'ho controllato fino alla nausea e secondo me è corretto....
per semplicità inserisco solo la parte incriminata....
Grazie a chiunque riuscirà a darmi un indizio....
PS:i socket sono NON BLOCCANTI e utilizzo il polling sulla select... e comunque anche con tecniche di i/o multiplexing non ho ottenuto miglioramenti.
for(;;)
{
//******************************************************
//** LETTURA **
//******************************************************
rdset=all;
do {
ris=select(maxfd+1,&rdset,NULL,NULL,&noWaiting);
} while ((ris<0) && (errno==EINTR));
if(ris<0)
{
perror("select failed: ");
exit(1);
}
else if (ris==0) {/* debug */}
else //un socket è pronto in lettura!!
{
for(i=0;i<numconnentrata;i++)
{
//********************************************************
//** TENTATIVI DI CONNESSIONE **
//********************************************************
if ((listenfdattivo[i]) && (FD_ISSET(listenfd[i],&rdset )))
{
OMISSIS
qui dentro c'e' il codice con cui accetto le
connessioni in entrata sui socket in ascolto
e con cui creo i socket da cui verranno ridiretti
i vari pacchetti giunti sin qui
qui non ci sono errori e comunque la funzione
entra qua dentro solo quando un socket prova
a collegarsi
}
//********************************************************
//** TENTATIVI DI SCRITTURA **
//********************************************************
L'ERRORE DEVE ESSERE QUI.... MA SEMBRA TUTTO OK!!!!!!!!!!!!!!
else if( (connectedfdattivo[i]) && (FD_ISSET(connectedfd[i],&rdset )) )
{
//Provo a leggere un messaggio intero,
//oppure i byte necessari a completarlo.
do {
ris=read(connectedfd[i], p_msgR[i], byteleftR[i]);
} while ( (ris<0) && (errno==EINTR) );
if(ris<0)
{
perror("read canale failed: ");exit (1);
fflush(stdout);
return (0);
}
else if(ris==0)
{
//Non ho più dati da leggere
printf ("Connessione n. %d chiusa \n", i);
close(connectedfd[i]);
FD_CLR(connectedfd[i], &all);
connectedfdattivo[i] = 0;
}
else
{
p_msgR[i] += ris;
byteleftR[i] -= ris;
}
if (byteleftR[i] == 0)
{
OMISSIS
nel caso abbia finito di leggere un
messaggio intero, lo inserisco in una cosa
e reinizializzo le variabili p_msgR e byteleftR[i]
}
}
}
vedete??? e talmente semplice che non mi capacito di come possa esserci un errore...
se avete bisogno di altre informazioni chiedete pure... e grazie ancora...
ormai non ricordo più da quanto sto sbattendo la testa su questo applicativo...
devo semplicemente creare 2 applicativi (sotto linux) il primo che crea dei socket tcp dai quali spedisco pacchetti, il secondo che riceve questi pacchetti e li ridirige a seconda del tipo di pacchetto che arriva.
funziona praticamente tutto, il problema pero' è che il socket che riceve i pacchetti di tanto in tanto diventa lentissimo a leggere (cioè passa da 10/20 millisecondi a 1/2 secondi per la lettura di un intero pacchetto di circa 2000byte!!!).
Di questo sono abbastanza sicuro... nel senso che ho fatto centinaia di controlli, e posso affermare con certezza che il problema SICURAMENTE non risiede ne nell'applicativo che spedisce i dati, e nemmeno risiede nel pezzo di codice che effettua le write dell'applicativo che legge i dati...
un'altra cosa un po' anomala, è che il problema a volte si presenta da subito... a volte non si presenta... altre volte funziona per un po' e poi inizia a rallentare.....
ho ridotto all'osso il codice, provando ad usare un solo socket ... ma niente...
sembra una maledizione + che un errore...
riuscite a darci un occhio? io l'ho controllato fino alla nausea e secondo me è corretto....
per semplicità inserisco solo la parte incriminata....
Grazie a chiunque riuscirà a darmi un indizio....
PS:i socket sono NON BLOCCANTI e utilizzo il polling sulla select... e comunque anche con tecniche di i/o multiplexing non ho ottenuto miglioramenti.
for(;;)
{
//******************************************************
//** LETTURA **
//******************************************************
rdset=all;
do {
ris=select(maxfd+1,&rdset,NULL,NULL,&noWaiting);
} while ((ris<0) && (errno==EINTR));
if(ris<0)
{
perror("select failed: ");
exit(1);
}
else if (ris==0) {/* debug */}
else //un socket è pronto in lettura!!
{
for(i=0;i<numconnentrata;i++)
{
//********************************************************
//** TENTATIVI DI CONNESSIONE **
//********************************************************
if ((listenfdattivo[i]) && (FD_ISSET(listenfd[i],&rdset )))
{
OMISSIS
qui dentro c'e' il codice con cui accetto le
connessioni in entrata sui socket in ascolto
e con cui creo i socket da cui verranno ridiretti
i vari pacchetti giunti sin qui
qui non ci sono errori e comunque la funzione
entra qua dentro solo quando un socket prova
a collegarsi
}
//********************************************************
//** TENTATIVI DI SCRITTURA **
//********************************************************
L'ERRORE DEVE ESSERE QUI.... MA SEMBRA TUTTO OK!!!!!!!!!!!!!!
else if( (connectedfdattivo[i]) && (FD_ISSET(connectedfd[i],&rdset )) )
{
//Provo a leggere un messaggio intero,
//oppure i byte necessari a completarlo.
do {
ris=read(connectedfd[i], p_msgR[i], byteleftR[i]);
} while ( (ris<0) && (errno==EINTR) );
if(ris<0)
{
perror("read canale failed: ");exit (1);
fflush(stdout);
return (0);
}
else if(ris==0)
{
//Non ho più dati da leggere
printf ("Connessione n. %d chiusa \n", i);
close(connectedfd[i]);
FD_CLR(connectedfd[i], &all);
connectedfdattivo[i] = 0;
}
else
{
p_msgR[i] += ris;
byteleftR[i] -= ris;
}
if (byteleftR[i] == 0)
{
OMISSIS
nel caso abbia finito di leggere un
messaggio intero, lo inserisco in una cosa
e reinizializzo le variabili p_msgR e byteleftR[i]
}
}
}
vedete??? e talmente semplice che non mi capacito di come possa esserci un errore...
se avete bisogno di altre informazioni chiedete pure... e grazie ancora...