Fehler bei accept()



  • Moin Leutz!

    Ich hab hier ein Problem bezüglich Sockets. wenn ich das accept() aufrufe hält mein Prog an und lässt nichts mehr mit sich machen. Ich muss es dann immer abbrechen und ich weiß nicht warum. Ich bekomm nicht mal ne Fehlermeldeung!!! 😞 Weiterhin schreibt mir das Prog auch nichts mehr in meine Listbox. Wenn ich aber mit Haltepunkten arbeite und schritt für schritt durchgehe, dann zeigt er mir die Ausgaben an.Warum? Keine Ahnung *ratlosbin* 😕

    Hier mal der Hauptteil von meinem Code:

    void MySniffer::lookforip(void)
    {
       int len = sizeof(sockaddr_in);
       int len2 = sizeof(sockaddr);
       int option_flag;
    
       //Socket wird auf Lokalen Server gebunden, bei Fehlschlag gib den Error aus
       if(bind(ServerSocket, (sockaddr*)&ServerSAddr, sizeof(ServerSAddr)) == SOCKET_ERROR)
       {
            Form1->ListBox1->Items->Add("Binding Socket failed: " + (AnsiString)WSAGetLastError());
            return;
       }
    
       //Socket-Optionen werden festgelegt
       if(setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&option_flag, sizeof(option_flag)*2) == SOCKET_ERROR)
       {
            Form1->ListBox1->Items->Add("Setting Socket-Options failed: " + (AnsiString)WSAGetLastError());
            return;
       }
    
       //Port wird abgehört, bei Fehlschlag gib den Error aus
       if(listen(ServerSocket, 5) == SOCKET_ERROR)
       {
          Form1->ListBox1->Items->Add("Listening on Socket failed: " + (AnsiString)WSAGetLastError());
          return;
       }
    
       //Endlosschleife
       for(;;)
       {
          //bei Anfrage akzeptiere Verbindung
          ClientSocket = accept(ServerSocket, (sockaddr*)&ClientSAddr, &len);
    
          //wenn der ClientSocket nicht erstellt werden konnte gib den Error aus
          if(ClientSocket == INVALID_SOCKET)
          {
             Form1->ListBox1->Items->Add("Initializing Client-Socket failed: " + (AnsiString)WSAGetLastError());
             break;
          }
    
          //Ausgabe des Remote-Hostnamens, bei Fehler gib den Error aus
          if(getpeername(ClientSocket, (sockaddr*)&ClientSAddr, &len2) == SOCKET_ERROR)
          {
             Form1->ListBox1->Items->Add("Getting Peername of Client-Socket failed: " + (AnsiString)WSAGetLastError());
          }
          else
          {
             IP = inet_ntoa(ClientSAddr.sin_addr);
             Form1->ListBox1->Items->Add(IP);
          }
          Sleep(1000);
       }
    }
    

    P.S. das Ganze befindet sich in einer Klasse; der ServerSocket wird in einer anderen Methode initialisiert

    Ich hoffe ihr könnt mir helfen? 🙄

    Danke!



  • Ich würde zum einen die Socket-Optionen vor dem Aufruf von "bind()" setzen, damit diese auch wirksam werden.

    "accept()" wartet so lange (und zwar blockierend), bis ein Verbindungswunsch eines Clients eingeht.

    Wenn du nicht willst, dass deine komplette Anwendung blockiert ist, dann würde ich den "accept()-Aufruf" und die nachfolgende Kommunikation in einem jeweils eigenen Thread behandeln.



  • Hey Danke für die schnelle Hilfe! 😃

    Wenn du nicht willst, dass deine komplette Anwendung blockiert ist, dann würde ich den "accept()-Aufruf" und die nachfolgende Kommunikation in einem jeweils eigenen Thread behandeln.

    Dann werd ich mal versuchen das in einen Thrad zu packen, damit meine Anwendung auch weiterlaufen kann!


Anmelden zum Antworten