|
You last visited: Today at 01:15
Advertisement
Winsockets Crash?
Discussion on Winsockets Crash? within the C/C++ forum part of the Coders Den category.
05/05/2012, 12:49
|
#1
|
elite*gold: 0
Join Date: Jan 2010
Posts: 359
Received Thanks: 57
|
Winsockets Crash?
Hey,
Wollte mich seit langem nun auch mal an Sockets ransetzen, ich schaffe eine Verbindung aber es Crasht oft und zeigt mir bei recv(); nur Zahlen an und nicht die Buchstaben die gesendet werden  Habe das nötigste im Code belassen damit ich nicht soviel durcheinander im Code habe, aber sobald ich dann ein cout , cin ode ähnlichs im Code nutzen möchte Crasht es sofort.. mit printf(); geht es zeigt aber falsche Daten an..  Jemand eine Idee?
Code:
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
int startWinsock(void);
using namespace std;
int main(){
long rc;
SOCKET connectedSocket;
SOCKET acceptSocket;
SOCKADDR_IN addr;
char buf[256];
// Winsock starten
rc=startWinsock();
// Socket erstellen
acceptSocket=socket(AF_INET,SOCK_STREAM,0);
//Socket an Port binden und eigenschaften setzen
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(6667);
addr.sin_addr.s_addr=ADDR_ANY;
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
//Auf Verbindung warten..
rc=listen(acceptSocket,10);
//Akzeptieren..
connectedSocket=accept(acceptSocket,NULL,NULL);
printf("Client verbunden..\r\n");
//Daten empfangen..
strcpy(buf,"Hallo!\0");
rc=send(connectedSocket,buf,6,0);
while(true){
rc = recv(connectedSocket,buf,256,0);
buf[rc] = '\0';
cout << rc << " Bytes received: " << buf << endl;
//Verbindung getrennt?
if(rc==0){
printf("Vebindung getrennt!");
return 0;
}
}
}
Wäre demjenigen sehr Dankbar der mir helfen kann..
lg cy
|
|
|
05/05/2012, 13:04
|
#2
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Haste fein zusammenkopiert, l2c.
|
|
|
05/05/2012, 13:14
|
#3
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
rc = recv(connectedSocket,buf,256,0);
buf[rc] = '\0';
|
Dein Puffer ist nur 256 Characters groß. Setze hier 255, sonst hast du bei buf[rc] evtl nen Pufferüberlauf.
Quote:
|
cout << rc << " Bytes received: " << buf << endl;
|
so geht das nicht.. versuch es mit cout.write.. Und lern die Sprache.
|
|
|
05/05/2012, 13:15
|
#4
|
elite*gold: 0
Join Date: Jan 2010
Posts: 359
Received Thanks: 57
|
@MoepMoep Wie gesagt bin ich gerade dabei das zu lernen, da möchte ich erstmal rausfinden was es an den ganzen codeteilen brauch damit ich dann selbst was daraus programmieren kann, mir gehts vorerst erstmal darum "es zu schaffen überhaupt ein funktionierenden code zu bekommen" - ohne die ganzen fehler-kontrollen mit den if´s etc. - und wenn es dabei schon crasht werde ich erstrecht nicht selbst coden anfangen wenn ich mich noch nicht mit winsockets auskenne, da wird dann nur müll dabei herrauskommen. Es ist nicht umsonst ein Tutorial wo es darum geht zu lernen woher ich den Code teilweise habe MoepMoep. Wenn ich aber den Fehler für den Crash finde, hilft mir es auch nichts jetzt anzufangen mühsam selbst das ganze zu coden, wenn am Ende doch wieder der selbe Fehler kommen wird. Wenn du also nichts zu meiner Frage beizutragen hast, lass es bitte ganz okay?Danke
lg
Quote:
Originally Posted by xNopex
Dein Puffer ist nur 256 Characters groß. Setze hier 255, sonst hast du bei buf[rc] evtl nen Pufferüberlauf.
so geht das nicht.. versuch es mit cout.write.. Und lern die Sprache.
|
so geht das sehr wohl^^ -> using namespace std; vor dem int main() setzen dann kann man ganz normal mit cout<<"mein text"; sein text ausgeben lassen. Information..Ich arbeite NICHT mit .Net C++ sondern ganz normalem (Devc++)  Jedenfalls danke für den Tipp, werde es versuchen - wenn es klappt werde ich berichten 
Und zu "und lern die Sprache" - Ich kann die Sprache schon sehr gut wie ich finde, habe mich bisher nur nie wirklich mit Sockets beschäftigt, weil ich die imme so sehr verabscheut hatte wegen den ganzen Bugs die imme auftratten , da bin ich immer Verzweifelt und habs sein gelassen und Offline Programme programmiert..
EDIT: Habe es nun getan wie du sagtest, klappt leider nicht - Es crasht sobald der Client etwas sendet.. Ob dies nun Nettalk(möchte ne art mini irc-server machen), Telnet oder sonstiges ist.
Ich frage mich allerdings wieso es Crasht wenn ich cout, cin oder sonstiges wie cin.get(); verwende.. Als ob es allergisch auf C++ Funktionen wäre, printf() funktioniert wunderbar, nehme ich jedoch z.b cout crasht es erbitterlich.. komische Sache.
Grüße,
Cy
|
|
|
05/05/2012, 13:17
|
#5
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
Quote:
Originally Posted by Cyb0r
@MoepMoep Wie gesagt bin ich gerade dabei das zu lernen, da möchte ich erstmal rausfinden was es an den ganzen codeteilen brauch damit ich dann selbst was daraus programmieren kann, mir gehts vorerst erstmal darum "es zu schaffen überhaupt ein funktionierenden code zu bekommen" - ohne die ganzen fehler-kontrollen mit den if´s etc. - und wenn es dabei schon crasht werde ich erstrecht nicht selbst coden anfangen wenn ich mich noch nicht mit winsockets auskenne, da wird dann nur müll dabei herrauskommen. Es ist nicht umsonst ein Tutorial wo es darum geht zu lernen woher ich den Code teilweise habe MoepMoep. Wenn ich aber den Fehler für den Crash finde, hilft mir es auch nichts jetzt anzufangen mühsam selbst das ganze zu coden, wenn am Ende doch wieder der selbe Fehler kommen wird. Wenn du also nichts zu meiner Frage beizutragen hast, lass es bitte ganz okay?Danke
lg
|
1. so einen blocktext ohne absätze liest sich kein mensch durch.
2. erst die sprache lernen, dann sich mit etwas "kompliziertem" wie sockets befassen
3. dann sind auch diese unnötigen fragen "kann mir bitte jemand sagen, was an dem copy paste code falsch ist?!?!?" nicht mehr nötig.
kthxbye
EDIT:
schmeiß dein DEVC++ ausm fenster und hol dir visual C++ Express von microschrott.
|
|
|
05/05/2012, 13:19
|
#6
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
so geht das sehr wohl^^ -> using namespace std; vor dem int main() setzen dann kann man ganz normal mit cout<<"mein text"; sein text ausgeben lassen. Information..Ich arbeite NICHT mit .Net C++ sondern ganz normalem (Devc++) Jedenfalls danke für den Tipp, werde es versuchen - wenn es klappt werde ich berichten
|
Du hast da aber ein char-Array... Was du da ausgeben wirst ist vllt. die Adresse des Arrays, wenn alles gut läuft. Jedenfalls nicht den Text. Aber danke fürs Belehren.
EDIT: iwie gehts doch. Habs anders in Erinnerung.. Versuchs trotzdem mal mit cout.write..
|
|
|
05/05/2012, 13:23
|
#7
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
devc++ ist veraltet, compiler kann man evtl. updaten, aber selbst die ide ist nicht zu empfehlen.
jedenfalls hat xNopex den fehler schon genannt, buffer overflow.
der buffer hat 255 byte, wenn du aber an byte 256 schreiben willst, könnte es u.U. sein dass du in diesem bereich keine schreibrechte hast, da er evtl. schon im code bereich liegt. damit kommt es dann zu einer AV und du bekommst dieses typische 'programm funktioniert nicht mehr' fenster
@xNopex: std::cout << buf << std::endl; würde sehr wohl funktionieren!
nur wird ein nullterminierter string erwartet, wenn keine 0 zu finden ist, kann es da evtl. auch zu einer AV kommen, muss es aber nicht!
edit: wow, war ich so langsam, dass direkt 2 posts zwischen sind?
edit2: was das empfangen der daten angeht, arbeite ich gerne mit ioctlsocket und FIONREAD um direkt zu wissen, wie gross der buffer sein muss!
|
|
|
05/05/2012, 13:27
|
#8
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
nur wird ein nullterminierter string erwartet, wenn keine 0 zu finden ist, kann es da evtl. auch zu einer AV kommen, muss es aber nicht!
|
Vermutlich wird das der Fehler bei ihm sein:
Quote:
strcpy(buf,"Hallo!\0");
rc=send(connectedSocket,buf,6,0);
|
|
|
|
05/05/2012, 13:29
|
#9
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
Quote:
Originally Posted by xNopex
Vermutlich wird das der Fehler bei ihm sein:
|
fügt strcpy nicht noch selbst eine 0 mit an? oder bin ich da falsch informiert?
ging dir vermutlich daraum, dass nur die bytes vom 'H' bis einschliesslich '!' gesendet werden?
|
|
|
05/05/2012, 13:31
|
#10
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Jadoch schon, aber er sendet nur 6Zeichen. Also vergisst er die 0-Terminierung mitzusenden. Wenn er das immer so macht, dann failed das natürlich bei der Ausgabe.
EDIT: Brainfuck er terminiert ja beim Empfangen...
|
|
|
05/05/2012, 13:32
|
#11
|
elite*gold: 0
Join Date: Jan 2010
Posts: 359
Received Thanks: 57
|
Quote:
Originally Posted by Dr. Coxxy
1. so einen blocktext ohne absätze liest sich kein mensch durch.
2. erst die sprache lernen, dann sich mit etwas "kompliziertem" wie sockets befassen
3. dann sind auch diese unnötigen fragen "kann mir bitte jemand sagen, was an dem copy paste code falsch ist?!?!?" nicht mehr nötig.
kthxbye
EDIT:
schmeiß dein DEVC++ ausm fenster und hol dir visual C++ Express von microschrott.
|
1. Wenn du so einen Blocktext nicht lesen willst LASS ES - Niemand zwingt dich dazu..
Aber schreibe auch kein Kommentar hierzu ohne ihn zu lesen, das ist total Unnötig!
Und Welche IDE ich nutze ist komplett meine Entscheidung, das geht dich ein Käse an.
Ich mag kein .Net-Schrott und werde es auch niemals nutzen um zu Programmieren, Basta.
Grund dafür? Ich mag die Syntax und die vielen zusätzlichen Codezeilen nicht,
das macht das ganze Projekt total unübersichtlich und nunja,
es trägt nicht grade dazu bei einen Bug schnell zu finden, mir gefällt es einfach nicht.
2. Habe ich bereits geschrieben das ich die Sprache bereits sehr gut kann meiner Meinung,
mich aber noch nie wirklich gut mit Sockets auseinandergesetzt habe,
da werde ich ja wohl nach Hilfe fragen dürfen wenn ich nicht allene klar komme.
3. Lese mein Text durch dann wüsstest du es besser
@alle anderen
Habe den Puffer nun Vergrößert, bekomme leider immer noch einen Crash
"Programm wurde vorzeitig beendet" gibt es noch irgendetwas das den Crash verursachen könnte 
Habe den Programmcode der strcpy() & sendet nun mal weggelassen um zu sehen ob es deswegen Crasht, leider nicht. Sobald man dem Server etwas sendet Crasht er
Liebe Grüßé,
Cy
|
|
|
05/05/2012, 13:49
|
#12
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
das mit der ide geht uns auch nichts an, allerdings können wir doch sicherlich andere ide's die eindeutig aktueller sind empfehlen?
ich bin kein microschrott fan, empfehle daher also code::blocks + mingw(-w64)
der gcc unterstützt sowieso sachen, von denen der msvc oder mingw von devc++ nur träumen  (z.b. c++0x)
lediglich inline asm is fürn *****, aber das fürfte nicht interessieren, da man das mit nem assembler assemblieren und später selbst mit linken kann
ansonsten sehe ich jedenfalls keinen möglichen fehler im code, der buffer wird terminiert. damit fällt die mögliche AV bei cout weg.
debug ausgaben?
|
|
|
05/05/2012, 13:52
|
#13
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Quote:
|
Ich mag kein .Net-Schrott und werde es auch niemals nutzen um zu Programmieren, Basta.
|
Visual Studio ist auch direkt .Net, alles klar ;o
Quote:
|
das macht das ganze Projekt total unübersichtlich
|
Willst du behaupten, dein 'Code' sei übersichtlich?
Quote:
|
Habe ich bereits geschrieben das ich die Sprache bereits sehr gut kann
|
Haha, nein.
Quote:
|
ohne die ganzen fehler-kontrollen mit den if´s etc
|
Dort haben wir übrigens deinen Fehler. :>
Übrigens könntest du das ganze auch debuggen, schonmal dadran gedacht? :>
|
|
|
05/05/2012, 14:03
|
#14
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
msvc unterstützt aber dinge, die dich in schwierigkeiten bringen wenn man sie mit anderen compilern verwenden will
msvc würde das funktionieren:
Code:
enum HUMAN
{
ME,
MOEPMEEP,
****
};
HUMAN h=HUMAN::****;
aber nur msvc unterstützt das
als anfänger (wovon ich hier ausgehe) lernt man da schnell 'falsche' sachen!
Quote:
|
ich kann meiner meinung nach schon sehr gut
|
falsch.
es geht nicht nach deiner meinung!
vergleich doch mal baum mit wasser (? war es das? wer weiss worauf ich hinaus will?^^)
man kann keine relativen vergleiche anstellen. das ist einfach falsch, die können niemals stimmen!
entweder ist etwas gut oder schlecht, dazu darf es nur einen maßstab geben.
nicht mehr!
anderes (vermutlich besseres) beispiel:
ein kind (ca. 140): 'ich bin gross!'
ein erwachsener mensch (ca. 190): 'ich bin das echte gross!'
kapiert?
|
|
|
05/05/2012, 14:05
|
#15
|
elite*gold: 0
Join Date: Jan 2010
Posts: 359
Received Thanks: 57
|
Quote:
Originally Posted by MoepMeep
Visual Studio ist auch direkt .Net, alles klar ;o
Willst du behaupten, dein 'Code' sei übersichtlich?
Haha, nein.
|
Visual Studio ist nicht gleich direkt .Net, aber schonmal jemand gesehen der nicht .Net mit Visual Studio codet? Das ist..etwas unnötig und überladen die Gui. Es erinnert mich irgendwie auch stark an meine Anfangszeiten damals als Kind wo ich mit Visual Basic v6.0 "Rumgeklickt" hab..
Ich mag die GUI einfach nicht, fühle mich darin total unwohl - vorallem wahrscheinlich weil wieder vieles anders ist und man haufenweise Errors entgegengeworfen bekommt wenn man versucht seine nomalen Codes die bisher liefen darin zum laufen zu bekommen.
Ansonsten.. Codeübersichtlichkeit?
Das ist Ansichtssache, für mich ist es einigermaßen Übersichtlich und ich komme damit klar, der Code soll ja aber auch keinen Schönheitswettbewerb gewinnen sondern ich soll ihn verstehen und er soll funktionieren
Auf Übersichtlichkeit im Code zu achten ist hilfreich wenn man ein Projekt nach einer langen Zeit wieder nutzen möchte, oder mit anderen daran arbeitet, aber zum lernen / rumprobieren mit einer neuen Funktion/Art da ist das meiner Meinung Sinnfrei 
Zu den ganzen Fehlerkontrollierenden If´s -> Die Prüften ja nur ob die Verbindung geklappt hat, etwas Empfangen werden konnte etc. Das mach das ganze unübersichtlich zum lernen finde ich, verwirrt etwas wenn du da ein Bug hast und dann noch tausende unnötige Abfragen drin.
Bei größeren Projekten sind die aber sicher ganz nützlich, oder wenn mans dann schon beherrschen sollte.
Debugen hab ich schon versucht, komme da aber nicht wirklich ein nen Nenner  Wenn ichs in Devc++ Debugge scheint es zu funktionieren, es Crasht nicht, gibt aber auch die empfangenen Daten nicht aus  Am Ende wenn ich es beende, kommt jedoch "Acces Violation - Segmentation Fault" ..hmmm
@HeavyHacker
Es gibt immer jemand der es besser als man selbst kann, würde ich sagen "Ich kann gut programmieren" würde ich lügen,denn es wird immer jemanden geben der findet das ich schlecht bin oder nicht besonders gut. Das ist alles ne Subjektive Meinung von jeder Person selbst , wie gut jemand ist. Das kann man finde ich nicht so fest definieren wie in deinem Beispiel.
Beispiel:
Jemand kann sehr gut Konsolen Programme und die Grundbasics, schafft es einigermaßen gute Programme zu entwickeln. Sagen wir einfach er kann Cheats programmieren.
Das ist doch schon sehr gut ,würde diese Person denken.
Nun gibt es abe sicherlich Personen die Windows GUIs Programmieren, Ring0 Treiber Programmieren können , Netzwerk-Anwendungen und sonstigen Kram. Diese Person würde sich auch als "gut" ansehen, und die vorherige Person als schlecht/nicht gut. Nehmen wir die 3. Person hinzu, jemand der nur in Batch scripten kann, diese wird denken das Person 1 Sehr gut ist, und Person 2. ein Gott des Programmierens, einfach weil er es nicht besser weiß.
Es gibt immer jemand der einer anderer Meinung ist..
Grüße,
Cy
|
|
|
All times are GMT +1. The time now is 01:15.
|
|