[Winsock] Hilfe bei Chat Server
-
Also habe es jetzt so gelöst,das man jetzt beliebige Sachen zum server hinsenden kann.
Aber wenn ich den client beende.
Läuft der Server dauernt weiter.
d.h er gibt verschiedene Nachrichten aus.
So jetzt hatte vorhin jemand gesagt das wenn ich was an den Client senden will mache ich es völlig verkehrt.
Wie sende ich den richtig Sachen an den Client?
-
Du schriebst "send(sckServer, blabla)";
Doch es´muss heißen "send(sckClient, blabla)";
-
So gut ok danke.
Jetzt hatte ich die Schleife ein bisschen erweitert:SOCKET sckClient = accept(sckSocket, 0, 0); while (1) { /* Zum Ausgrenzen um die Anzahl und schnelligkeit der Durchläufe zu sehen */ printf ("----\n"); if (sckClient != INVALID_SOCKET) { /* Nur 1 Strich und kein 'hier müsste was kommen' Also bleibts bei Accept stehen. */ if (recv(sckClient, Request, sizeof(Request), 0) > 0) { printf ("%s\n",Request); /* Auf Request antworten. */ char test[] = "hallo zurück"; send (sckSocket, test, 12, 0); } } } closesocket (sckSocket); }Wenn der Client jetzt aber die Verbindung schließt,kommen mehrere Zeilen -----.
Wie behebe ich den das?
-
Wenn du den clienten schließt ist sckClient == INVALID_SOCKET, daher wird dieser if-Block mit der Bedingung : sckClient != INVALID_SOCKET übersprungen und die Schleife wird jedes mal einfach aufs neue ausgeführt ohne auf eine Nachricht zu warten.
Willst dudas verhindern, darfst du die Striche nur ausgeben lassen wenn sckClient ebenfalls != INVALLID_SOCKET ist.
-
Habe des Problem mit den Strichen leider nicht beheben können.
Aber jetzt kommt schon wieder ein neuer Fehler.
Ich sende:
-Test1
-Test2
-h
-Test3
-A
-LolWas aber dabei rauskommt ist das:
-Test1
-Test2
-hest2
-Test3
-Aest3
-Lolt3Hier der Screen:
http://img514.imageshack.us/img514/690/lolfd3.jpg
-
-
Initialisiere "Request" mit 0 vor Aufruf von recv ().
-
if (sckClient != INVALID_SOCKET) { printf ("----\n"); }Das Problem mit der Ausgabe muss nicht unbedingt am Server liegen, sondern vielleicht auch am Clienten.
Wenn merkers Tipp das Problem nicht löst wird der wohl auch sein.Du verwendest dort für die verschiedenen Nachrichten doch sicherlich den selben string oder?
Wie befüllstdu den denn?
Versuche mal den string erst komplett zu leeren bevor du die neue Botschaft reinschreibst oder setze manuell ein '\0' an das Ende deiner gewünschten Nachricht.
Rein zum testen könntest du auch mal versuchen für das verschicken der verschiedenen Nachrichten verschiedene strings zu verwenden, sollte dieser Fehler dann immer noch auftauchen weißt du zu mindest dass es doch nciht am Clienten liegt
(oder nicht liegen muss).
-
Die Sache is die der Client is in VB6.

Glaube eigentlich nicht das es am Client liegt.
-
Liegt auch nicht am Clienten.
Wenn der Server zum zweiten Mal recv () aufruft, enthält der Empfangspuffer "Request" immer noch die Daten vom ersten Aufruf.
Je nach empfangener Datenlänge wird der "Rest" immer mit angezeigt.Deshalb mit 0 initialisieren :
"memset (Request,0,sizeof(Request));" vor "recv ()".
-
Danke merker.
Denn Befehl memset kannte ich gar nicht.
xD
So jetzt muss ich des nur noch mit den Strichen lösen.
-
So noch eine Letzte Frage.
Wie kann ich es einstellen das wenn die Verbindung getrennt wurde das sich der Server.exe beendet?
-
Wenn sckClient den Wert INVALID_SOCKET enthält, springstdu halt aus deiner schleife.
-
Also muss ich des mit ner If-Abfrage machen?