Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 19.07.2007, 16:19 Titel: Mein erstes Chat-Programm: Fehler! |
|
|
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 |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 19.07.2007, 16:23 Titel: |
|
|
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 |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 19.07.2007, 16:37 Titel: |
|
|
hmm irgendwie klappt das auch nicht ...
Da kommt genau der gleiche Fehler^^
Ich poste am besten mal den ganzen Code:
Client
Server |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 19.07.2007, 17:37 Titel: |
|
|
Vllt noch prüfen ob der Tastaturpuffer leer ist, nach jedem einlesen? |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 19.07.2007, 20:55 Titel: |
|
|
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 |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 20.07.2007, 09:17 Titel: |
|
|
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 |
|
|
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 20.07.2007, 09:19 Titel: |
|
|
ä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 |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 20.07.2007, 09:37 Titel: |
|
|
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 |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 20.07.2007, 10:41 Titel: |
|
|
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 |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 20.07.2007, 11:04 Titel: |
|
|
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 |
|
|
|