C++ Socket (winsock): send wird erst bei Beenden der Verbindung ausgeführt
-
Hallo zusammen!
Ich arbeite derzeit gerade an einem Projekt, für das ich eine Socket-Connection zwischen Java (als Server) und C++ (als Client) benötige; mein Betriebssystem ist Windows Vista, ich arbeite mit Dev-Cpp.
Der Server in Java steht schon, mit einem Java-Client habe ich auch keine Probleme - es werden Strings auf beiden Seiten gesendet und empfangen (also schließe ich den Server als Fehlerquelle einmal aus).
Mein C++ Client funktioniert leider nicht so ganz, wie ich es möchte; er empfängt die Daten und gibt sie auf der Console aus 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.) Das Empfangen funktioniert, also das macht er auch, sobald ich es vom Server wegschicke.
Ich vermute, dass ich beim send() Aufruf irgend etwas falsch mache... hat jemand eine Idee?
Ich bin für jede Hilfe dankbar...
Liebe Grüße,
miquagiDer Code vom Client:
[cpp] #include <windows.h> #include <winsock2.h> #include <conio.h> #include <string> #include <iostream> using namespace std; SOCKET Socket; SOCKADDR_IN addr; int main(){ string m_host = "127.0.0.1"; string m_port = "2000"; WSADATA wsa; int rc = WSAStartup(MAKEWORD(2, 0), &wsa); if(rc == SOCKET_ERROR){ cout << "Error while starting server... \n"; } Socket = socket(AF_INET, SOCK_STREAM, 0); if(Socket == INVALID_SOCKET){ std::cout << "Error while building socket. \n"; } addr.sin_addr.s_addr = inet_addr(m_host.c_str()); addr.sin_port = htons(atoi(m_port.c_str())); addr.sin_family = AF_INET; if(connect(Socket, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == 0){ cout << "Connection with server " << inet_ntoa(addr.sin_addr) << " established." << endl << endl; } else { cout << "Impossible to connect to server " << inet_ntoa(addr.sin_addr) << ":" << addr.sin_port << ". Please check host and port. \n"; return 1; } // Everything okay - start communicating with server char buffersend[1024]; char bufferrecv[1024]; int bufpos = 0; int bufIndex = 0; char c; fd_set fdSetRead; TIMEVAL timeout; bool mainloop = true; while(rc != SOCKET_ERROR && mainloop){ FD_ZERO(&fdSetRead); FD_SET(Socket, &fdSetRead); timeout.tv_sec = 0; timeout.tv_usec = 0; //RECEIVE DATA while((rc=select(0,&fdSetRead,NULL,NULL,&timeout)) != 0) { u_long iNumBytesPresent; u_long iMode = 1; // switch socket to non-blocking rc = ioctlsocket(Socket, FIONBIO, &iMode ); //recv (returns if there is no data) rc = recv(Socket, bufferrecv,1023, 0); iNumBytesPresent = rc; // if first recv call returned immediately while(iNumBytesPresent <= 0) { rc = ioctlsocket(Socket, FIONREAD ,&iNumBytesPresent); if(iNumBytesPresent > 0) { break; } // Read available number of bytes rc = recv(Socket, bufferrecv, iNumBytesPresent, 0); } bufferrecv[rc] = '\0'; cout << "Message from server: " << bufferrecv << '\n'; } //SEND DATA while(kbhit()){ c = getch(); if(c==13){ if(strcmp(buffersend, "exit") == 0){ mainloop = false; break; } bufpos++; cout << "Sending '" << buffersend << "' to server.\n"; rc = send(Socket,buffersend,bufpos, 0); bufpos = 0; } else { buffersend[bufpos++]=c; } } buffersend[bufpos] = '\0'; } cout << "Shutting down client. \n"; closesocket(Socket); WSACleanup(); cout << "\nPROGRAM EXIT"; } [/cpp]
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.