Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » [c++ konsole] warten auf taste während prog läuft

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.05.2005, 19:02 Uhr
~hdz
Gast


Hi Leute,

wie kann ich das bewerkstelligen:

C++:
//...
SOCKET s;
char buf[256];
//...

while(rueckgabe != SOCKET_ERROR){
   while(!press_key){
      rueckgabe = recv(s, buf, 256, 0);
   }
   gets(buf);  
   rueckgabe = send(s, buf, strlen(buf), 0);
}




Also ich möchte dass die Funktion recv() (winsock) auf daten vom client warten bis man eine taste drückt. dann soll das programm aus der schleife raus. praktisch, dass man was eingeben kann.
das problem ist meiner ansicht nach, dass recv() ja wartet bis sie was empfängt, und nicht einfach abgebrochen werden kann. und dann weiß ich auch nicht wie ich überhaupt sagen kann dass etwas passiert wenn eine (beliebige) taste gedrückt wird.

Danke euch schon mal im vorraus,
Grüße,

HdZ

Dieser Post wurde am 06.05.2005 um 20:13 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.05.2005, 20:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


mit select kann man schaun ob am socket was anliegt, das auf tastendruck geht über conio.h und kbhit, ist aber unschön
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.05.2005, 23:33 Uhr
~hdz
Gast


Danke FloSoft, bin jetzt weiter! :-)


C++:
while(rueckgabe != SOCKET_ERROR){
      while(1){      
         rueckgabe = recv(s, buf, 256, 0);
        
         if(kbhit()){break;}
        
         if(rueckgabe == SOCKET_ERROR){
            cout << "Fehler: recv\nCode: " << WSAGetLastError() << endl;
         }
         else{
            buf[rueckgabe] = '\0';
         }
         cout << buf << endl;
      }

      gets(buf);
      rueckgabe = send(s, buf, strlen(buf), 0);
      if(rueckgabe == SOCKET_ERROR){
         cout << "Fehler: send\nCode: " << WSAGetLastError() << endl;
      }
      else if(rueckgabe != strlen(buf)){
         cout << "Fehler: send\nNur " << rueckgabe << "bytes gesendet!\n";
      }
   }



So das würde jetzt funktionieren, wenn nicht recv() auf eine Eingabe wartet.
Andererseits soll es ja warten, aber eben nur so lange, bis ich eine Taste drücke. (Um selbst etwas zu senden)

Bitte gib mir ein beispiel für select(), ich werd da nicht schlau draus.

Danke,

hdz

Dieser Post wurde am 07.05.2005 um 10:15 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.05.2005, 23:35 Uhr
~hdz
Gast


ups, das if(kbhit()){break;}
sollte eigentlich fett werden.
naja, darum gehts eben.

(wehe jetzt ist es auf einmal fett :-D)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.05.2005, 10:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


oben in der Leiste gibt es 2 rote Einträge: Zum einen die "Suche". Die kann man auch mal bemühen für sowas


C++:
fd_set conn;
struct timeval timeout;
timeout.tv_sec = 5; // 5 Sekunden Timeout
timeout.tv_usec = 0;

FD_ZERO( &conn );
FD_SET( socket, &conn );


int s = select( ((int)socket + 1), &conn, NULL, NULL, &timeout ); // das +1 ist wichtig, frag mich nicht wieso
if( s > 0 )
{
  // daten sind da, socket ist readable, also hier recv aufrufen!
}




ansonsten in codetags doppelte klammern für fett & co: [[b]]
--
class God : public ChuckNorris { };

Dieser Post wurde am 07.05.2005 um 10:15 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.05.2005, 19:35 Uhr
~hdz
Gast



C++:
fd_set conn;
    struct timeval timeout;
    timeout.tv_sec = 2; // Sekunden Timeout
    timeout.tv_usec = 0;

    FD_ZERO( &conn );
    FD_SET( s, &conn );

    while(rueckgabe != SOCKET_ERROR){
       rueckgabe = select( ((int)socket + 1), &conn, NULL, NULL, &timeout ); // das +1 ist wichtig, frag mich nicht wieso
       if( rueckgabe > 0 ){
          rueckgabe = recv(s, buf, 256, 0);
          if(rueckgabe == SOCKET_ERROR){
             cout << "Fehler: recv\nCode: " << WSAGetLastError() << endl;
          }
          else{
             buf[rueckgabe] = '\0';
          }
       }
       if(kbhit()){
          gets(buf);
          rueckgabe = send(s, buf, strlen(buf), 0);
          if(rueckgabe == SOCKET_ERROR){
             cout << "Fehler: send\nCode: " << WSAGetLastError() << endl;
          }
          else if(rueckgabe != strlen(buf)){
             cout << "Fehler: send\nNur " << rueckgabe << "bytes gesendet!\n";
          }
       }
    }



Sorry, ich habe mir alles erdenkliche durchgelesen, aber ich kapier einfach nicht, warum das Programm beendet, sobalt ich keine Eingabe mache, oder spätestens wenn ich enter drücke nachdem ich eine taste gedrückt habe, normal sollte es doch dann wieder an den Anfang der while Schleife laufen.

Bitte helft mir nochmal, ich finds nicht raus...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.05.2005, 19:39 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn dein socket s heißt solltest du bei select auch s benutzen. ansonsten musst du das fd_set immer wieder neu zuweisen, sonst gibts undefiniertes verhalten (also das fd_set-zeug alles in die while-schleife rein.
Ansonsten glaube ich das kbhit & gets keine gute lösung sind, nimm getch und les manuell ein (wenn schon ungebufferter input, dann richtig)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.05.2005, 10:44 Uhr
~hdz
Gast


Danke für deine schnelle Antwort.
Bin gerade auf der Arbeit, und kann es nicht ausprobieren.

Nur der Richtigkeit halber, (damit es daheim gleich klappt :-) ):


C++:
fd_set conn;
    struct timeval timeout;
    timeout.tv_sec = 2; // Sekunden Timeout
    timeout.tv_usec = 0;

    while(rueckgabe != SOCKET_ERROR){
       FD_ZERO( &conn );
       FD_SET( s, &conn );

       rueckgabe = select( (s + 1), &conn, NULL, NULL, &timeout );
       if( rueckgabe > 0 ){
          rueckgabe = recv(s, buf, 256, 0);
          if(rueckgabe == SOCKET_ERROR){
             cout << "Fehler: recv\nCode: " << WSAGetLastError() << endl;
          }
          else{
             buf[rueckgabe] = '\0';
          }
       }
       if(kbhit()){
          getch(buf);
          rueckgabe = send(s, buf, strlen(buf), 0);
          if(rueckgabe == SOCKET_ERROR){
             cout << "Fehler: send\nCode: " << WSAGetLastError() << endl;
          }
          else if(rueckgabe != strlen(buf)){
             cout << "Fehler: send\nNur " << rueckgabe << "bytes gesendet!\n";
          }
       }
    }



Kurze Zwischenfrage. Ich glaube ich hatte schonmal getch() verwendet, hatte dann aber das Problem, dass wenn ich mehrere Wörter eingegeben habe, diese beim Server (bzw. Client) als einzelne Wörter ankamen.

Anstatt so:
Server: Hallo wie gehts?

Kam es so:
Server: Hallo
Server: wie
Server: gehts?

Wie kann ich das umgehen?

Danke, und Grüße,
HdZ

Dieser Post wurde am 09.05.2005 um 11:05 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.05.2005, 11:07 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


getch liest immer nur ein zeichen vom inputbuffer, d.h du solltest sowas machen:


C++:
int x = 0;
while(kbhit())
{
  buf[x] = getch();
  buf[x+1] = '\0';
  if(buf[x] == '\n')
  {
          x = 0;
          rueckgabe = send(s, buf, strlen(buf), 0);
          if(rueckgabe == SOCKET_ERROR){
             cout << "Fehler: send\nCode: " << WSAGetLastError() << endl;
          }
          else if(rueckgabe != strlen(buf)){
             cout << "Fehler: send\nNur " << rueckgabe << "bytes gesendet!\n";
          }
  }
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.05.2005, 11:13 Uhr
~hdz
Gast


Hi, das if(buf[x] == '\n') funktioniert nicht.
Ich denke '\n' heißt enter (return), wenn ich da eine andere Taste benutze dann sendet er, aber bei enter nicht.
Kann es sein dass das ein Fehler ist?

Danke,
HdZ
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: