[C/C++] socket-verbindung will nicht mehr in klasse

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von asdrexit, 27. Juni 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 27. Juni 2008
    socket-verbindung will nicht mehr in klasse

    Arbeite mich gerade in Socket-Programmierung mit c++ ein und hab ein komisches Problem. Wenn ich alles einfach in der main() ohne Schickschnack mache klappt Es aber als ich das Ganze in ne Klasse gepackt habe gibt connect() einen Fehler zurück(bzw -1) ?(

    Benutze den GNU g++ compiler unter Linux.

    BW ist klar.

    Hier mal mein Source von den wichtigen Sachen:

    Header:
    Spoiler
    Code:
    #ifndef __SOCKET_H__
    #define __SOCKET_H__
    
    #ifdef __DEBUG__
     #include <iostream>
    #endif
    
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    
    #define SOCKETE_OK 0x0
    #define SOCKETE_PREPARE 0x1
    #define SOCKETE_NOT_READY 0x2
    #define SOCKETE_CONNECT 0x3
    #define SOCKETE_SEND 0x4
    #define SOCKETE_RECV 0x5
    
    class CSocket
    {
    public:
     CSocket();
     ~CSocket();
    
     virtual bool connect(char* address, ushort port);
     virtual bool quit();
    
     bool sendbuffer(char* buf, size_t length);
     bool recvbuffer(char* buffer, size_t length);
    
     int getlasterror() {return m_lasterror;};
    protected:
     int m_socket;
     int m_lasterror;
    private:
     bool prepare();
    };
    
    
    #endif // __SOCKET_H__
    
    

    Code:
    Spoiler
    Code:
    #include "socket.h"
    
    CSocket::CSocket()
    {
     #ifdef __DEBUG__
     std::cout << "#Creating socket in debug mode.\n";
     #endif
     m_lasterror = 0;
     this->prepare();
    }
    
    CSocket::~CSocket()
    {
    
    }
    
    bool CSocket::prepare()
    {
     #ifdef __DEBUG__
     std::cout << "#Prepare socket... ";
     #endif
     m_socket = socket(AF_INET, SOCK_STREAM, 0);
     if (m_socket == -1)
     {
     m_lasterror = SOCKETE_PREPARE;
     return false;
     }
     #ifdef __DEBUG__
     std::cout << "done\n";
     #endif
     return true;
    }
    
    bool CSocket::connect(char* address, ushort port)
    {
     if (m_socket == -1)
     {
     m_lasterror = SOCKETE_NOT_READY;
     return false;
     }
    
     struct sockaddr_in addr;
    
     addr.sin_addr.s_addr = inet_addr(address);
     addr.sin_port = htons(port);
     addr.sin_family = AF_INET;
    
     #ifdef __DEBUG__
     std::cout << "#Connecting to " << address << " on port " << port << "... ";
     #endif
    
     if (::connect(m_socket, (sockaddr*)&addr, sizeof(addr)) == -1)
     {
     #ifdef __DEBUG__
     std::cout << "\033[31;1mfailed\n";
     std::cout << "\033[0m";
     #endif
    
     m_lasterror = SOCKETE_CONNECT;
     return false;
     }
     #ifdef __DEBUG__
     std::cout << "done\n";
     #endif
     return true;
    }
    

    main
    Spoiler
    Code:
    
    #include <iostream>
    #include "ceolib/socket.h"
    
    int main()
    {
     CSocket *s = new CSocket::CSocket;
    
     if (!s->connect((char*)"www.blub.de", 21))
     {
     printf("connect() failed \n");
     return 0;
     }
    
     char buffer[50] = "user anonymouse\0";
     if (!s->sendbuffer(buffer, 20))
     {
     std::cout << "sendbuffer() failed: " << s->getlasterror() << std::endl;
     return 0;
     }
    
     delete s;
     return 0;
    }
    
     
  2. 27. Juni 2008
    AW: socket-verbindung will nicht mehr in klasse

    Du musst, soweit ich weiß, noch die Liberary mit WSAStartup initializieren.

    Mfg Rushh0ur
     
  3. 27. Juni 2008
    AW: socket-verbindung will nicht mehr in klasse

    1. mit WSAStartup initialisieren (wie Rushh0ur schon gesagt hat)
    2. Kannst du der inet_addr Funktion nur eine IP im Format A.B.C.D übergeben, allerdings keine Hostnamen (www.blub.de)
    Damit das geht, musst du erst den Namen auflösen (mit gethostbyname()):
    Code:
    sockaddr_in addr;
    hostent *host;
    
    host = gethostbyname(address); // address = www.blub.de
    if (!host)
    {
     herror("gethostbyname() failed");
     return 1;
    }
    
    addr.sin_addr = *(struct in_addr*) host->h_addr;
    
     
  4. 27. Juni 2008
    AW: socket-verbindung will nicht mehr in klasse

    Am 2. wirds wohl gelegen haben; kann es atm leider nicht ausprobieren. Hatte vorhe immer die IP von dem Server angeben. BWs sind raus. Thx
     
  5. 21. Juli 2008
    AW: socket-verbindung will nicht mehr in klasse

    WSAStartup wird nur unter windows verwendet. Da er aber unter linux programmiert wird das nicht benötigt.
     
  6. 21. Juli 2008
    AW: socket-verbindung will nicht mehr in klasse

    Ja, das hab ich ganz überlesen.
    Aber wie er schon gesagt hat, es lag am 2. Punkt, Thema deshalb erledigt

    Damit closed

    Achja: Bitte hör auf, Themen von vor 2 Wochen rauszugraben, wenn die eh schon erledigt/in Vergessenheit geraten sind.
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.