Newsgroup: it.comp.lang.c++
Titolo: [socket] controllo dei dati

Scusatemi innanzitutto se le domande che vi porro' potranno risultare banali
ma mi sto avventurando da poco nella programmazione ad oggetti e potrei
saltare delle cose che ad altri risultano ovvie :)
Comunque ho trovato in rete delle classi per la gestione del socket che, una
volta ridefiniti gli operatori << e >> per l'uso con i socket permettono di
salvare in una var di tipo string i dati che transitano tra server e
client.
In particolare:
// -- RIDEFINITI GLI OPERATORI SHIFT (in ServerSocket.cpp)
const ServerSocket& ServerSocket::operator << ( const std::string& s ) const
{
  if ( ! Socket::send ( s ) )
      throw SocketException ( "Could not write to socket." );
  return *this;
}
const ServerSocket& ServerSocket::operator >> ( std::string& s ) const
{
  if ( ! Socket::recv ( s ) )
      throw SocketException ( "Could not read from socket." );
  return *this;
}
// e gestione dei dati nell'implementazione del server
while ( true )
        {
          ServerSocket new_sock;
          server.accept ( new_sock );
          new_sock << "Welcome to NULL Server!\n";
          try
            {
              while ( true )
                {
                  std::string data;
                  new_sock >> data;
                  new_sock << data;
                }
            }
          catch ( SocketException& ) {}
        }
Quello che ora mi chiedo e': perche', quando io vado a confrontare la
variabile string "data" con una stringa, come ad esempio:
 std::string data;
 new_sock >> data;
 if ( data == "test" ) std::cout << "Vero";
 else std::cout << "Falso";
il controllo ritorna SEMPRE falso, anche provando combinazioni di stringhe
che includono il RETURN o il terminatore di stringa??
Non riesco in alcun modo ad effettuare controlli sulla variabile data (che a
quanto pare diventa un "char data[X]" e non una string dopo
l'assegnamento...
Qualcuno sa dove e' l'errore o sa spiegarmi il motivo?? Magari mi basta
utilizzare delle funzioni particolari che non ho in mente :)
In ogni caso, grazie a chi mi dara' una mano!
Andrea
-- 
bunker
+++++++++++[>++++++>++++++++++++++++++++++++++++++++
+>++++++++++<<<-]>.>++++++++++.>.<----------.>---------.<+++++++.

 1) In particolare dove sono la "bind()" e la "listen()" ?
Ovviamente ti ho postato solo le parti che mi interessavano, le rimanenti le
trovi qui:
http://www.linuxgazette.com/issue74/tougher.html
ciao


 
http://www.linuxgazette.com/issue74/tougher.html
Nessuno ha idea di come fare? :(


 ciao
Grazie, mi può interessare e darò un'occhiata.
Ciao,
FabioMDF
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 In ogni caso ho altri dubbi sulla correttezza del programma.
Grazie, ho capito dove e' il problema...
Le classi sono queste: 
http://www.linuxgazette.com/issue74/tougher.html
ciao



Ciao,
mi sembra di capire che vuoi leggere "data" dopo avere eseguito la riga
"new_sock >> data;" , è così ?
In quest caso, cosa ti fa pensare che tu abbia un qualsiasi valore in "data"
?
Mi spiego meglio. Se ti aspetti che l'overloading dell'operatore shift a
destra, così per come l'hai definito utilizza il riferimento a string solo
per poi passarlo come parametro al metodo Socket::recv(). Dovresti vedere
che cosa ne fa quest'ultimo ( della stringa che gli hai passato ). Per certo
non la copia su una variabile di nome "data" che tu hai appena prima creato
e che la funzione non può conoscere, se stai usando una libreria di terzi.
E poi mi chiedo che ci fa una recv() di tipo static ( visto che la invochi
con il nome di una classe e non di un oggetto ) ? Va be' è anche possibile
che il server sia progettato per accettare solo una connessione per volta e
quindi ... Non si può così stabilire se è un tuo errore o un cattivo
disegno della libreria.
In ogni caso ho altri dubbi sulla correttezza del programma.
1) In particolare dove sono la "bind()" e la "listen()" ?
2) Che cosa è l'oggeto "server" che chiama la "accept()"
3) La "accept()", nel suo funzionamento normale ( da specifiche ), deve
restituire un nuovo socket su cui si andrà a leggere e scrvere, invece
SEMBRA (!) che tu utilizzi invece il socket passivo originario per le
operazioni suddette.
La cosa più importante che mi sembra di notare è che forse non hai ancora
molto chiaro il funzionamento delle Socket API oltre che del C++ ( come tu
stesso dici ). Se è così ti consiglio di lasciare perdere l'utilizzo di
classi trovate in giro e invece di prendere un buon manuale di
programmazione client/server per il tuo OS e di imparare l'argomento
costruendo tu stesso gli algoritmi client e server usando le syscalls nel
modo correto ed efficente. Solo dopo sarai in grado di sfruttare al meglio
le classi e le librerie più diffuse e valide che si trovano in giro.
Buon divertimento ( e lavoro, se capita ),


 ciao
Grazie, mi può interessare e darò un'occhiata.
Ciao,
FabioMDF
