Newsgroup: it.comp.os.linux.development
Titolo: Socket e strani comportamenti

Ho una socket che si chiama ds_socket_chld e il codice mi funziona.
Se faccio: 
int soc = ds_socket_chld
e poi cambio i riferimenti nel codice con soc.
Il risultato non e' lo stesso come e' possibile ??
CODICE FUNZIONANTE: 
        char *buff = (char *)malloc(MAX_DIM);
        memset(buff,NULL_CH,256);
        char *ch;
        read(ds_sock_chld,ch,1);
        while( (*ch != '\n') ) {
                strcat(buff,ch);
                printf("%s \n",buff);                                              
                read(ds_sock_chld,ch,1);                                   
        } 
 
OUTPUT:
Socket pronta ! Attendo connessioni ...
Ho accettato una connessione
p 
pr 
pro 
prov 
prova 
provad 
provadi 
provadif 
provadifu 
provadifun 
provadifunz 
CODICE MODIFICATO:
        int soc = ds_sock_chld; /* Ho aggiunto questa assegnazione */
        char *buff = (char *)malloc(MAX_DIM);
        memset(buff,NULL_CH,256);
        char *ch;
        read(soc,ch,1); /* ho messo soc anziche ds_sock_chld */
        while( (*ch != '\n') ) {
                strcat(buff,ch);
                printf("%s \n",buff);                                              
                read(soc,ch,1);
        }
OUTPUT: 
Socket pronta ! Attendo connessioni ...
Ho accettato una connessione
pē 
pērē 
pērēoē 
pērēoēvē 
pērēoēvēaē 
pērēoēvēaēdē 
pērēoēvēaēdēiē 
pērēoēvēaēdēiēfē 
pērēoēvēaēdēiēfēuē 
pērēoēvēaēdēiēfēuēnē 
pērēoēvēaēdēiēfēuēnēzē  
probabilmente e' una mia svista enorme, per cuimi scuso per labanalita' 
della domanda.
grazie,
        Claudio

         }
Il codice contiene un errore molto grave. La variabile 'ch' non è stata
inizializzata. Questo è già sufficiente per determinare un comportamento
indefinito. Inoltre, il secondo argomento di strcat deve puntare a un
array null-terminated, e nel codice non c'è nulla che garantisca questo.
Mi rendo conto che questo è un programmino di prova, ma mi permetto di
darti un suggerimento: se devi manipolare (riempire, copiare, concatenare)  
buffer di dati NON usare le funzioni della famiglia str*.
Ad esempio, se sappiamo quanta roba c'è in un buffer, e in questo caso lo
sappiamo, non ha proprio alcun senso usare strcat (che ha complessità
O(N)) per aggiungere un carattere in fondo.
Se, invece, non sappiamo quanti caratteri ci sono, usare strcat è comunque
pericoloso. Quindi: non usare mai strcat.
Max

 buffer di dati NON usare le funzioni della famiglia str*.
Anche a me non piacciono molto, piu' che altro perche' ero abituato meglio
in altri linguaggi.
Se non uso questa famiglia di funzioni a cosa mi appoggio ??
Esiste qualcosadi gia fatto o devo e' meglio implementare qualcosa ex-novo
( in effetti tutto quello che mi viene in mente e'
 O(N) )
Grazie del prezioso aiuto.
--
--
Claudio Rosati E. 
c.ro...@scepsi.it
Web Designer & Developer
--
www.scepsi.it
Scepsi, for all the things you are not in business for... we are

  O(N) )
La mia soluzione e' O(1).
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
              pngstego 0.3.2 has been released! 
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */

 buffer di dati NON usare le funzioni della famiglia str*.
e se devi lavorare con le stringhe che fai? ti riscrivi le funzioni col
rischio di fare peggio?
Piuttosto e' meglio usare delle accortezze: al post di strcat e' meglio
usare strncat, strcpy->strncpy e simili.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Linguaggio C (Ansi C) Brian W. Kernighan Dennis M. Ritchie
Jackson Libri
Fa una pippa tanta dell'implementazione di malloc (fa pure un esempio di
come rifare la funzione), ma in tutto illibro non lo usa mai.
Probabilmente negli esempi che fa non serve, pero' poi vedendo un codice
normale malloc e simili sonoi comandi piu' usati. Adesso l'ho imparato.
Grazie per la spiegazione dettagliata, mi hai tolto un impiccio , e sei
stato chiarissimo.


 col rischio di fare peggio?
Oh, beh, dipende. Se devi lavorare con stringhe di dimensioni non modeste,
usare strcat o strlen, anzichè incapsulare tutto in struct e fornire
apposite funzioni, è un approccio fallimentare. Immagina di dover gestire
stringhe di svariati MB di lunghezza. Usare strlen o strcat ogni volta che
ti serve conoscerne la lunghezza o devi concatenarci qualcosa è assurdo,
perchè terribilmente inefficiente. 
Inoltre, un programma che faccia un uso intenso delle stringhe, dovrà
comunque incaspulare dati e logica (creazione, manipolazioni,
riallocazioni, etc.) utilizzando strutture e funzioni apposite; non ha
senso disseminare un programma di malloc, free e memcpy.
Max

 senso disseminare un programma di malloc, free e memcpy.
mah... ho appena finito un programma così. Secondo me è questione di
rigorosità del programmatore. Vabbé che le mie stringhe erano lunghe al
massimo poche decine byte, però venivano elaborate molto intensamente.

 massimo poche decine byte, però venivano elaborate molto intensamente.
Chiaramente si puo' fare. Ma un minimo di astrazione puo' aumentare
efficienza, compattezza e leggibilita' in modo massiccio.
Se l'utilizzo massiccio comprende anche le varie strlen, strcpy e cazzi vari
e' passibile di miglioramento. Senza sbattersi troppo salvando la lunghezza
in un campo apposito.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Take It All, Our Gold, Our Homes, Our Life, But We Didn't Kill 
	    Your Christ! !>- Blind Guardian - The Script For My Requiem