Server Error: 10047



  • Hallo, ich habe folgendes Programm im Rahmen eines Tutorials geschrieben:

    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h> 
    
    using namespace std;
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    } 
    
    int main(int argc, char *argv[])
    {
    
        long rc;
    
      SOCKET acceptSocket;
    
      SOCKET connectedSocket;
    
      SOCKADDR_IN addr;
    
      // Winsock starten
    
      rc=startWinsock();
    
      if(rc!=0)  {
        cout <<"Fehler: startWinsock, fehler code: \n" << rc;
        return 1;
      }  else  {
        cout << "Winsock gestartet!\n";
      }
    
      // Socket erstellen
    
      acceptSocket=socket(AF_INET,SOCK_STREAM,0);
    
      if(acceptSocket==INVALID_SOCKET)
      {
        cout <<"Fehler: Der Socket konnte nicht erstellt werden, fehler code: \n" << WSAGetLastError();
        return 1;
      }  else  {
        cout << "Socket erstellt!\n";
      }
    
      // Port zuweisen
    
      addr.sin_family=AF_INET;
      memset(&addr,0,sizeof(SOCKADDR_IN)); 
      addr.sin_port = htons(12346);
      rc = bind(acceptSocket,(SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
      if(rc==SOCKET_ERROR) {
          cout << "Fehler: bind, fehlercode: \n" << WSAGetLastError();
          //return 1;
      } else {
          cout << "Socket an Port 12345 gebunden\n";
      }        
    
      // LISTENING
    
      rc = listen(acceptSocket, 10);
    
      if(rc==SOCKET_ERROR) {
          cout << "Fehler: listen, fehler code: \n" << WSAGetLastError();
          //return 1;
      } else {
          cout << "acceptSocket ist im listen Modus....\n";
      }
    
      connectedSocket = accept(acceptSocket, NULL, NULL);
    
      if(connectedSocket==INVALID_SOCKET) {
          cout << "Fehler: accept, fehler code: \n" << WSAGetLastError();
          //return 1;
      } else {
          cout << "Neue Verbindung wurde aktzeptiert!\n";
      }        
    
      system("PAUSE");	
      return 0;
    }
    

    Nun kommt folgende Ausgabe:

    Winsock gestartet!
    Socket erstellt!
    Fehler: bind, fehlercode: 10047
    Fehler: listen, fehler code: 10022
    Fehler: accept, fehler code: 10022
    Press any key to continue . . .
    

    Offensichtlich klappt bei der bind-Funktion die Portnummerzuweisung nicht.
    Bei google habe ich unter der Fehlernummer nachgeschaut und nur den Bezug auf einen Client gefunden. D.h. wenn der Fehler beim Client auftaucht, dann liegt das einfach nur daran, dass der entsprechende Port von keinem Server besetzt ist.
    Aber wie ist das beim Server?
    Und vor allem: Wie kann ich das kleine Problem beheben?



  • Benutz bei der socket-Funktion statt AF_INET PF_INET. Das Argument spezifiziert die zu verwendende Protokollfamilie.
    Fehlermeldung 10047 bedeutet: "Address family not supported by protocol family."
    Eine Beschreibung der Fehlercodes findest du hier:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp
    socket-Bechreibung:
    http://www.zotteljedi.de/doc/socket-tipps/socket.html



  • Vielen Dank für die Adressen und die Hilfe.
    Aber leider klappt es trotzdem nicht. Ich habe versucht mit der Familie AF_INET die Portnummer zu wechseln und außerdem habe ich versucht(wie du es mir gesagt hast) PF_INET zu verwenden. Beides bringt leider den vorherigen Effekt wieder...
    Könnte es auch sein, dass der Fehler nicht am Code selbst liegt, sondern an meinem Rechner?



  • Solltest dennoch die PF dort nutzen, da dort die Protokollfamilie und nicht die Adressfamilie festgelegt wird. 😉
    Füg mal vor bind dies ein:
    addr.sin_addr.s_addr = INADDR_ANY;
    Damit legst du fest das der Server über alle Netze Verbidnungen aufnehmen soll.

    Mehr fällt mir jetzt auch nicht auf, außer beim accept, das kenn ich nur so:
    int len=0;
    connectedSocket = accept(acceptSocket, (SOCKADDR *)&addr, &len);



  • Hm... Eigenartig, trotz der guten Tipps und der Hilfe klappts immernoch nicht.
    Ich werd das ganze mal auf einem anderem rechner probieren. Vielleicht liegts dann wirklich an meinem(ich verwende den Dev-C++) Compiler, aber ich glaub das hat damit nix zu tun?

    Jedenfalls vielen Dank für deine Hilfeleistung!



  • Dieser Thread wurde von Moderator/in HumeSikkins 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.



  • ändere das hier mal

    // Port zuweisen 
    addr.sin_family=AF_INET;
    memset(&addr,0,sizeof(SOCKADDR_IN)); // <-- diese Zeile vor die dadrüber setzen
    addr.sin_port = htons(12346);
    
    // Port zuweisen 
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
    addr.sin_port = htons(12346);
    

Anmelden zum Antworten