JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=730cff85e8920cc19607508b37e44fcdMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Mein erstes Chat-Programm: Fehler!

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 19.07.2007, 17:19    Titel: Mein erstes Chat-Programm: Fehler! Antworten mit Zitat

Hi,

ehm ich habe mich mal an die Winsocks gewagt und bin schon ziemlich weit jedoch gibst da ein komisches Problem :

Client:
CPP:
int nachrichtSenden()
{
   char buffer[100];
   int weiter = 0;
   int test;

   while(weiter != 1)
   {
   cin>> buffer;

   test = send(s, buffer, strlen(buffer)+2, 0);

   cout << "\nWeiter? (1 fuer exit):" <<endl;
   cin>> weiter;
   }

   return 1;
}

Server:
CPP:
int nachrichtEmpfangen()
{
   char buffer[100];
   int test;

   while(test != 0)
   {
      test = recv(connectedSocket, buffer, 100, 0);
      cout<< buffer <<endl;
   }

   return 0;
}


Wenn ich hier einzelne Wörter vom Clienten aus sende läufts auch ohne Probleme.
Aber sobald ich einen Satzt wie: "Wie gehts?" oder so schicke, führt der Client die ganze Zeit diese Zeile aus :

CPP:
cout << "\nWeiter? (1 fuer exit):" <<endl;


Und der Server kriegt nur das erste Wort und sobald ich minimiere oder verschiebe ist die Console leer.

Könnt ihr mir sagen wo der Denkfehler ist ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 19.07.2007, 17:23    Titel: Antworten mit Zitat

CPP:
#include <string>

int nachrichtSenden()
{
   std::string buffer;
   int weiter = 0;
   int test;

   while(weiter != 1)
   {
   std::getline( std::cin, buffer );

   test = send(s, buffer.c_str(), buffer.length(), 0);

   cout << "\nWeiter? (1 fuer exit):" <<endl;
   cin>> weiter;
   }

   return 1;
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 19.07.2007, 17:37    Titel: Antworten mit Zitat

hmm irgendwie klappt das auch nicht ...
Da kommt genau der gleiche Fehler^^
Ich poste am besten mal den ganzen Code:

Client
Server
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 19.07.2007, 18:37    Titel: Antworten mit Zitat

Vllt noch prüfen ob der Tastaturpuffer leer ist, nach jedem einlesen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 19.07.2007, 21:55    Titel: Antworten mit Zitat

CPP:
#include <string>

int nachrichtSenden()
{
   std::string buffer;
   int weiter = 0;
   int test;

   while(weiter != 1)
   {
   std::getline( std::cin, buffer );

   test = send(s, buffer.c_str(), buffer.length(), 0);

   cout << "\nWeiter? (1 fuer exit):" <<endl;
   cin>> weiter;
   }

   return 1;
}



Es löst zwar dein jetziges Problem nicht aber du solltest das hier umbauen um später keines zu bekommen.

Du hast am Serber einen Empfangsbuffer von 100 byte aber sendest beliebig viele. Das solltest du soweit umbauen das du max 100 Byte sendest und dann so lange in 100 byte schritten bis der Buffer komplett übertragen ist und dann neue Daten einlesen.

Grüße

PS: Sockets (vor allem an Port gebundene) immer schließen (Programmende)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 20.07.2007, 10:17    Titel: Antworten mit Zitat

hmm? Ich habe das doch auf 100 bytes eingestellt?

CPP:
test = recv(connectedSocket, buffer, 100, 0);


edit:// achso ne ja jetzt verstehe ich^^
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 20.07.2007, 10:19    Titel: Antworten mit Zitat

ähm soweit ich weiß liest ::std::cin NUR bis zum ersten lehrzeichen!
der rest bleibt im buffer!! und wir beim nächsten cin genommen und der benutzer wir nichtmehr um einen eingabe gebeten! Du musst nach cin immer schauen ob noch was im Buffer ist und wenn ja grad nochmal cin aufrufen und das ergebnis zum vorhandenen String hinzufügen!
_________________
Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 20.07.2007, 10:37    Titel: Antworten mit Zitat

Stimmt den wenn ich die "Weiter"-Eingabe weg mache dann werden bei einem Satz alle Wörter untereinadner angezeigt.

Vorhin wurde das zweite Wort dann immer auf die "Weiter"-Eingabe übertragen und da das ein int ist kamm ein Fehler.

Doch wie soll ich das machen dass die cin Funktion alle Wörter in den String überträgt ?? Hat cin evtl auch einen Rückgabewert??
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 20.07.2007, 11:41    Titel: Antworten mit Zitat

Ok hat sich erledigt, habs hingekriegt :

CPP:
int nachrichtSenden()
{
         char temp[1000];
      std::string eingabe;

      while(1)
      {
         std::cin.getline(temp, 1000, '\n');
         eingabe = temp;
         eingabe += "\n";

         send(s, eingabe.c_str(), eingabe.length(), 0);
      }

   return 1;
}

_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 20.07.2007, 12:04    Titel: Antworten mit Zitat

Ne, nimm lieber std::string und std::getline(). Letzteres liest eine ganze Zeile aus und string ist definitiv die bessere Alternative zu einem char array.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum