Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] Intercettare tasto invio in Linux

    salve!
    in VC++ ho usato la funzione _getch() della libreria conio.h per intercettare il tasto invio:
    codice:
     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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    quando premo invio nn succede nulla.
    Cosa intendi con non succede nulla?

    Sul mio pc questo programma stampa 10 (line feed).
    codice:
    #include <stdio.h>
    
    int main() 
    {
        char c;
        
        c = getchar();
        printf("%d\n", c);
    
        return 0;
    }

  3. #3
    ok grazie.
    appena torno a casa provo e ti dico!!

  4. #4
    provato semplicemente così:
    codice:
    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:
    codice:
    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??

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Prova a rieseguirlo con queste 2 printf:
    codice:
    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.

  6. #6
    infatti penso che il problema sia nella funzione initConnection.
    quel prontf nn viene stampato.
    ho trovato però il punto:
    codice:
    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?

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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.

  8. #8
    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!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.