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,
    miquagi

    Der 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.


Anmelden zum Antworten