Sockets: send wird erst zu Programmende ausgeführt

Hallo!

Ich arbeite derzeit gerade an einem Projekt, für das ich eine Socket-Connection zwischen Java (als Server) und C++ (als Client) benötige.

Der Server in Java steht schon, mit einem Java-Client habe ich auch keine Probleme - es werden Strings auf beiden Seiten gesendet und empfangen. Jetzt habe ich in C++ einen Client geschrieben, der nicht so ganz macht, was ich möchte. Er empfängt die Daten und zeigt sie auf der Console an und er sendet die Daten auch, allerdings wird das Senden erst dann getätigt, wenn das Socket geschlossen wird. (Geschlossen wird dann, wenn ich auf der Console „exit“ eingebe.) Empfangene Strings werden sofort angezeigt.
Ich vermute, dass ich beim send() Aufruf irgend etwas falsch mache… hat jemand eine Idee?

Ich bin für jeden Hinweis dankbar!!! :smile:

Hier mein Code für den Client:

#include 
#include 
#include 

#include 
#include 
using namespace std;

SOCKET Socket;
SOCKADDR\_IN addr;


int main(){
 string m\_host = "127.0.0.1";
 string m\_port = "8888";

 WSADATA wsa;
 int rc = WSAStartup(MAKEWORD(2, 0), &wsa);
 if(rc == SOCKET\_ERROR){
 cout 0) {
 break;
 }
 // Read available number of bytes
 rc = recv(Socket, bufferrecv, iNumBytesPresent, 0);
 } 

 bufferrecv[rc] = '\0';
 cout 

Liebe Grüße,
melvont

Hallo melvont,

Jetzt habe ich in C++ einen
Client geschrieben, der nicht so
ganz macht, was ich möchte. Er empfängt die
Daten und zeigt sie auf der Console an und er
sendet die Daten auch, allerdings wird das Senden
erst dann getätigt,
wenn das Socket geschlossen wird.
(Geschlossen wird dann, wenn ich auf der Console „exit“
eingebe.) Empfangene Strings werden sofort angezeigt.
Ich vermute, dass ich beim send() Aufruf irgend etwas falsch
mache… hat jemand eine Idee?

Ist jetzt nicht gerade meine Spezialität.

Normalerweise soll nicht jedes Zeichen einzeln verschickt werden. deshalb werden die Daten in einen Buffer geschrieben. Erst wenn der Buffer voll werden die Daten automatisch gesendet.
Beim Schliessen von Geräten, wird implizit ein flush ausgeführt um noch nicht gesendete Daten abzuschicken.

Du musst also, nachdem du den Buffer gefüllt hast, noch mit flush das leeren erzwingen.

MfG Peter(TOO)

doch der Server…
Hallo Peter,

vielen Dank für Deine Antwort!

Jetzt hab ichs nämlich: ich habe am Ende eine 0 angehängt, damit mein Server weiß, wann die Nachricht zu Ende ist (nachdem ich nur vordefinierte Nachrichten versende, von denen keine eine 0 enthält, war das der einfachste Weg). Nur ist ein char ‚0‘ in Java halt was anderes als ein char ‚0‘ in C++ - und kommt über das Netzwerk gesendet auch anders an. Also lag das Problem doch beim Server… soweit zum „kann ich ausschließen“. :wink:

Danke für die Hilfe!

Liebe Grüße,
melvont