PDA

Visualizza la versione completa : [C++] Intercettare tasto invio in Linux


fermat
08-10-2012, 09:37
salve!
in VC++ ho usato la funzione _getch() della libreria conio.h per intercettare il tasto invio:


if(_getch() == 13)
{
// DO SOMETHING
}

vorrei sapere se esiste un modo anche per Linux.
ho provato ad usare varie funzioni tipo getchar(), ma quando premo invio nn succede nulla.

c0der
08-10-2012, 09:44
quando premo invio nn succede nulla.
Cosa intendi con non succede nulla?

Sul mio pc questo programma stampa 10 (line feed).


#include <stdio.h>

int main()
{
char c;

c = getchar();
printf("%d\n", c);

return 0;
}

fermat
08-10-2012, 11:52
ok grazie.
appena torno a casa provo e ti dico!!

fermat
08-10-2012, 21:05
provato semplicemente così:


int main(int argc, char** argv) {
Server s;
s.initConnection();
char c = getchar();
if (c == 10) {
s.stopConnection();
}
return 0;
}

dove la funzione stopConnection() in teoria dovrebbe terminare il programma:


int Server::stopConnection() {
close(socketInAscolto);
close(socketServer);
return 0;
}

invece dopo l'avvio del programma, se premo il tasto INVIO vedo solo il cursore che va a capo.
dove sbaglio??

c0der
08-10-2012, 21:11
Prova a rieseguirlo con queste 2 printf:


int main(int argc, char** argv) {
Server s;
s.initConnection();
printf("premere invio per continuare\n");
char c = getchar();
printf("getchar: %d\n", c);
if (c == 10) {
s.stopConnection();
}
return 0;
}


[EDIT] ti ho aggiunto una printf anche prima del getchar, non vorrei mai che il tuo codice non arrivasse
a getchar, sennò siamo da capo.

fermat
08-10-2012, 23:16
infatti penso che il problema sia nella funzione initConnection.
quel prontf nn viene stampato.
ho trovato però il punto:


void Server::initConnection() {
cout << "SERVER STARTED. PRESS ENTER TO EXIT" << endl;
socklen_t clilen;
char buffer[256];
struct sockaddr_in local;
struct sockaddr_in from;
int port = 20248;
bzero((char *) &local, sizeof (local));
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(port);
socketServer = socket(AF_INET, SOCK_STREAM, 0);
listen(socketServer, 5);
clilen = sizeof (from);

char c = getchar();
if (c == 10) { // FUNZIONA
exit(0);
}

socketInAscolto = accept(socketServer, (struct sockaddr *) &from, &clilen);

cout << "NON VIENE STAMPATO" << endl;

sprintf(buffer, "YOUR IP IS: %s", inet_ntoa(from.sin_addr));
send(socketInAscolto, buffer, strlen(buffer), 0);
cout << "CONNECTION FROM " << inet_ntoa(from.sin_addr) << endl;
}

l'ho messo nei commenti.
penso dipenda dal fatto che nn ci siano connessioni.
però in teoria uno dovrebbe poter terminare il programma lo stesso a prescindere.
qualche suggerimento?

c0der
09-10-2012, 11:32
Non è che nelle poche righe di risposta in un forum si possa un tutorial di socket.
Ti consiglio di leggerne uno, non so questo:
http://www.linuxhowtos.org/C_C++/socket.htm

Troverai:
<< The accept() system call causes the process to block until a client connects to the server. >>

Per uscire dal programma basati per ora sul CTRL+C.

Poi un giorno magari userai i thread, poi magari lo farai che gestisce più di un client, ....
ma per queste cose leggiti molto bene la teoria PRIMA di metterti a scrivere codice
sennò finisce che sei sempre impantanato.

fermat
09-10-2012, 12:05
no no figuriamoci.
nn volevo tutorial!!
anzi il link che mi hai indicato è proprio quello che ho seguito.
solo che in VC++ avevo messo il tutto dentro a un while infinito e già il multi-thread, però ho usato le librerie microsoft.
mi era sfuggita la riga che mi hai postato.

penso che mi leggerò qualcosa sul mult-threading.
intanto grazie!!

Loading