|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
[C++, Qt] I/O terminale
Ciao,
sto scrivendo un semplice client su console in stile telnet. Però sto utilizzando le librerie Qt e scrivendo in C++, dato che vorrei compilarla per più piattaforme. In C per l'I/O utilizzavo la solita select() e gestivo con le relative macro il multiplexing.... su Qt non dovrebbe essere molto diverso a parte essere più semplice, a quanto vedo con TCPSocket devo usare il metodo ReadyRead() giusto? Il punto è con stdout e stdin come faccio? Devo abbinare questi ad un oggetto QIODevice? Non avreste un esempio ? Il codice C da implementare è tipo il seguente: Codice:
void prompt(FILE* fp, int sock) { int maxfd; char send_buffer[BUFF_SIZE], recv_buffer[BUFF_SIZE]; fd_set rset; FD_ZERO(&rset); while(1) { FD_SET(fileno(fp),&rset); FD_SET(sock,&rset); maxfd = MAX(fileno(fp),sock)+1; select(maxfd,&rset,NULL,NULL,NULL); if(FD_ISSET(sock,&rset)) { memset(recv_buffer,0,sizeof(recv_buffer)); if(read(sock,recv_buffer,BUFF_SIZE) <= 0) { perror("read"); exit(-1); } fprintf(stdout,"%s\n$ ",recv_buffer); fflush(stdout); } if(FD_ISSET(fileno(fp),&rset)) { memset(send_buffer,0,sizeof(send_buffer)); if(fgets(send_buffer,BUFF_SIZE,fp) == NULL) return; if(write(sock,send_buffer,strlen(send_buffer)+1) <= 0) { perror("write"); exit(-1); } } } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
QTextStream cout(stdout);
cout << etc etc |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
grazie, ma ... sarà l'ora e la stanchezza ma mi si blocca su readline()...
Codice:
QString inText, temp; QTextStream data(stdout); QByteArray sendBuf; // ............ while(1) { while(sock.bytesAvailable()) { // ........ } inText.clear(); do{ inText = data.readLine(); } while(!inText.isNull()); sendBuf.append(inText); sock.write(sendBuf); } // ....... |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Direi che sia una cosa normale se apri stdout e ci leggi invece di scriverci
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
....
![]() .... come vedi dal codice..... devo mettere in un QByteArray ed inviare su un socket ciò che l'utente scrive sulla console.... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Devi aprire stdin in tal caso.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
si, si ma infatti.... guarda il codice è così
Codice:
QTextStream data(stdin); QByteArray sendBuf; while(1) { while(sock.bytesAvailable()) { memset(buffer,0,sizeof(buffer)); sock.read(buffer,256); cout << buffer; } // Però qui non so come usare data sock.write(sendBuf); } |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Come faresti con cin
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
![]() Codice:
while(1) { while(sock.bytesAvailable()) { memset(buffer,0,sizeof(buffer)); sock.read(buffer,256); cout << buffer; } do { data >> buffer; sendBuf.append(buffer,sizeof(buffer)); } while (sendBuf.isNull()); sock.write(sendBuf); } |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Devi dare invio
![]() Io ti consiglio di leggere una QString e poi copiare i dati nel buffer prima dell'invio (se l'input è maggiore di 256 byte ci potrebbero volere più write). |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
abbi pazienza .... ... c'è anche da considerare che il server è su linux
mentre questo client è su windows, quindi credo ci sia anche il problema del carattere di fine stringa.... considerando che quando faccio invio viene inserito "\n" su windows, prima di inviare sostituisco con "\r", poi dovrò fare l'inverso in ricezione... ma per il momento sarebbe bello tornasse qualcosa.... ![]() ho scritto così mò... ma nulla appare dopo il mio input # ls # ls .... eccc.... ma nessun ritorno, non credo che i dati vengano inviati sicuramente il server risponderebbe quello è già testato... Codice:
while(1) { while(sock.bytesAvailable()) { memset(buffer,0,sizeof(buffer)); sock.read(buffer,sizeof(buffer)); cout << buffer; } do { cout << endl << "# "; data >> buffer; buffer[qstrlen(buffer)-1] = '\r'; sendBuf.append(buffer,sizeof(buffer)); } while (sendBuf.isEmpty()); sock.write(sendBuf); } Ultima modifica di Teo@Unix : 25-02-2010 alle 09:29. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Leggi con una QString. In quel caso secondo me funziona come il cin nel C++, Ritorna quando dai invio, ma legge solo fino al primo spazio.
Ci sono tante alternative. Guardati un po' QTextStream. Ad esempio il metodo readLine. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
niente da fare...
a questo punto non ho idea di cosa provare... Codice:
while(1) { while(sock.bytesAvailable()) { memset(buffer,0,sizeof(buffer)); sock.read(buffer,sizeof(buffer)); cout << buffer; } cout << endl << "# "; sendBuf.append(data.readLine()); sock.write(sendBuf); } |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Anche a me...
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:35.