Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » server läuft nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.01.2004, 14:00 Uhr
RedEagle



vor etwa 5 Tagen habe "ich" mit hilfe von FloSoft diesen Server gebaut. er soll daten von einem Client empfangen, daoch das tut er nicht???? warum?? (der client gibt eine Bestätigung, das gesendet wurde)

C++:
//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(Server,cmd,500,0);
         cmd[readen] = '\0';
         std::cout << cmd << std::endl; //hir wird nichts ausgegeben !! ######################################
      
      }
      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;
}



ps: es gibt keine warnungen/errors vom Compiler (er bleibt einfach irgendwo stecken der server)
--
MFG RedEagle

Dieser Post wurde am 30.01.2004 um 14:02 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.01.2004, 14:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Du must das recv auf Client machen, nicht auf Server.
Client ist das Handle, über das der Client Dir daten sendet.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.01.2004, 14:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Ist abgeehen davon unsauber programmiert: connection hat falschen Inhalt, wenn accept beim 2ten mal schief geht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.01.2004, 15:00 Uhr
RedEagle



Tut mir leid wenns ne dumme Frage ist, aber ich benutze den Code zum Lernen und weiß noch nicht viel drüber:
wie mache ich das recv auf Client (ich find die Codestelle nicht)
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.01.2004, 15:02 Uhr
RedEagle



habe die stelle gefunden
Der code soll nicht perfect sein (nur übersichtlich und leicht zu verstehen)
trotzdem
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.01.2004, 15:06 Uhr
RedEagle



hat sich nicht gebessert
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.01.2004, 18:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:
virtual postete
Ist abgeehen davon unsauber programmiert: connection hat falschen Inhalt, wenn accept beim 2ten mal schief geht.

Hi virtual, das war auch nicht auf fehlerbehandlung ausgelegt

Ich hatte allerdings nen Fehler. Man muss natürlich am Socket vom Client recv aufrufen:


C++:
  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;
      }
    }


--
class God : public ChuckNorris { };

Dieser Post wurde am 30.01.2004 um 18:05 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.01.2004, 18:33 Uhr
RedEagle




C++:
    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))


so sieht die stelle jetzt aus und es wird immer noch nichts angegeben.
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.02.2004, 11:16 Uhr
RedEagle



Ich habs geschafft!!!!!!!
es fehlte nur ne blöde schleife:

C++:
char cmd[501];  
do //Wartet auf daten und gibt sie aus bis daten = server::down sind
{      
      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)
}
while(true); //#################################################################


--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.02.2004, 13:41 Uhr
(un)wissender
Niveauwart


Ho, dann würde ich das aber mit Threads machen...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: