Server läuft nicht



  • /includier noch Winsock2.h und die Lib Ws2_32 [OK]
    #include <windows.h>
    #include <iostream>
    #include <WinSock2.h>
    
    #pragma comment(lib,"Ws2_32.lib")
    #pragma comment(lib,"wsock32.lib")
    //#pragma comment(lib,"libws2_32.a")
    //#pragma comment(lib,"libwsock32.a")
    
    //C:\Programme aus dem netz\Dev-Cpp\lib
    
    #define SERVER_PORT 20000
    
    int main(void)
    {
      WSADATA wsa;
      static struct sockaddr_in sa;
      SOCKADDR_IN ca;
      fd_set rfds;
      struct timeval tv;
    
      // WSAStartup ist obligatorisch
      if(WSAStartup(MAKEWORD(2,0),&wsa)!=0)
      {
        std::cerr << "WSAStartup failure" << std::endl;
        WSACleanup();
        return 1;
      }
    
      SOCKET Server, Client;
    
      Server = socket(AF_INET,SOCK_STREAM,0);
      if(Server==INVALID_SOCKET)
      {
        std::cerr << "Server Socket creation failed" << std::endl;
        WSACleanup();
        return 1;
      }
    
      sa.sin_family=AF_INET;
        sa.sin_port=htons(SERVER_PORT);
      sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    
        // Hier wird die adresse mit dem socket gebunden
        if(bind(Server,(SOCKADDR*)&sa,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
      {
         std::cerr << "Server Socket bind failed" << std::endl;
         WSACleanup();
         return 1;
      }
    
        // Setze Socket auf "Warte auf Verbindungen"
        if(listen(Server,5)==SOCKET_ERROR)
      {
         std::cerr << "Server Socket listen failed" << std::endl;
         WSACleanup();
         return 1;
      }
    
      bool connection = false;
      for(;;) // Auf Verbindungen warten
      {
        // Timeout des Sockets setzen
        FD_ZERO(&rfds);
        FD_SET(Server, &rfds);
        tv.tv_sec = 2; // 2 Sekunden
        tv.tv_usec = 0;
    
        int iSelect = select( ((int)Server)+1, &rfds, NULL, NULL, &tv);
        if( SOCKET_ERROR == iSelect )
        {
          std::cerr << "Fehler: select fehlgeschlagen" << std::endl;
          WSACleanup();
          return 1;
        }
        if(FD_ISSET(Server,&rfds)) // Wenn Daten/Verbindung da sind/ist
        {
          if(connection) // Ja wir haben eine Verbindung
          {
            char cmd[501];        
            int readen = recv(Client,cmd,500,0);
            cmd[readen] = '\0';
            std::cout << "Empfang von " << readen << "Bytes: " << cmd << std::endl;
          }
          else //if(connection)
          {
             Client = accept(Server,NULL,NULL);
             if(INVALID_SOCKET == Client)
             {
               std::cerr << "Accepting Connection failed" << std::endl;
               Client = 0;
             }
             else //if(INVALID_SOCKET == Client)
             {
               connection = true; // nun haben wir eine Verbindung!        
             }//if(INVALID_SOCKET == Client)
          }//if(connection)
        }//if(FD_ISSET(Server,&rfds))
      }//for(;;)
      if(connection)
       closesocket(Client);
      closesocket(Server);
      WSACleanup();
      return 0;
    }
    

    Der Client sendet zwar die Zeichen, aber den Server empfängt sie nicht (es wird nichts angezeigt)
    Könnt ihr meir helfen



  • Ich vermute mal es liegt, daran, dass dein select() vor accept() kommt nachdem bei listen() eine Verbindungsanforderung eingegangen ist.


Anmelden zum Antworten