[Gelöst-Sockets] bind() unter linux funktioniert nicht?



  • Hi.
    Ich habe mal eine Klasse für Sockets geschrieben (naja, gut, dass manche Bücher fertigen Code bereitstellen =D). Ich habe den Code nur minimal verändert. Im Buch waren immer jeweils die Windows und Unix varianten angegeben.

    void Socket::bind(int port) {
        if (!valid) throw new SockEx(SockEx::cINVALID);
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(port);
    
        int r = ::bind(sodex, (sockaddr*)&addr, sizeof(addr)); // giebt -1 zurück, aber warum?!
        if (r < 0) throw new SockEx(SockEx::cFAIL);
    }
    

    Output:

    2 < Das ist SockEx::cFAIL
    terminate called after throwing an instance of 'SockEx*'
    Aborted
    Press [Enter] to close the terminal ...

    sodex ist der socket deskriptor (socket + index 🙂 )
    addr ist sockaddr_in
    SockEx eine sehr simple exception klasse
    Ich benutze Netbeans 6.9 auf Linux ubuntu 10.04

    Danke im Voraus 😃



  • Eventuell ist der Port bereits belegt. Versuch einen Port über 1024.



  • Ach, im übrigen solltest du die Struktur auch mit memset(&addr, 0, sizeof(addr)); auf 0 setzen:

    void Socket::bind(int port) {
        if (!valid) throw new SockEx(SockEx::cINVALID);
    
        memset(&addr, 0, sizeof(addr));  // <---
    
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(port);
    
        int r = ::bind(sodex, (sockaddr*)&addr, sizeof(addr));
    
        if (r < 0) throw new SockEx(SockEx::cFAIL);
    }
    


  • Ich blödmann. Danke. =|



  • lk schrieb:

    void Socket::bind(int port) {
        if (!valid) throw new SockEx(SockEx::cINVALID);
    ...
    }
    

    In C++ sollte man keine mit new allokierten Objekte als Excption werfen. Besser ist:

    void Socket::bind(int port) {
        if (!valid) throw SockEx(SockEx::cINVALID);
    ...
    }
    

    und später

    try {
      s.bind( 42 );
    }
    catch( const SockEx& ex ) {
    ...
    }
    

    Lars


Anmelden zum Antworten