Socket und HTTP



  • Hallo

    Ich versuche dieses Tutorial durchzuarbeiten:

    https://www.c-plusplus.net/forum/169861-full

    Ich bekomme den Code aus dem ersten Beispielprogramm zum erstellen eines Sockets über Port 80 und der Verbindung zu einer eingegebenen IP nicht zum compilieren. Die Windows spezifischen Inhalte habe ich entfernt, da ich ein Linux als System benutze.

    Der Code ist:

    #include <iostream>
    #include <sys/socket.h> // socket(), connect()
    #include <arpa/inet.h> // sockaddr_in
    
    int main()
    {
        using namespace std;
    
        int Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(Socket == -1)
        {
            cout << "Socket konnte nicht erstellt werden!" << endl;
            return 1;
        }
    
        sockaddr_in service; // Normale IPv4 Struktur
        service.sin_family = AF_INET; // AF_INET für IPv4, für IPv6 wäre es AF_INET6
        service.sin_port = htons(80); // Das HTTP-Protokoll benutzt Port 80
    
        string ip;
        cout << "IP: ";
        cin >> ip;
    
        service.sin_addr.s_addr = inet_addr(ip.c_str());
    
        int result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
        if(result == -1)
        {
            cout << "Verbindung fehlgeschlagen!" << endl;
            return 1;
        }
    
        cout << "Verbindung erfolgreich!" << endl;
    
        close(Socket);
    }
    

    und kompilieren führt zu dem Fehler:

    SocketAlphaMain.cpp:38:17: error: ‘close’ was not declared in this scope
         close(Socket);
    

    In meinem Lehrbuch steht, dass ich für die close Funktion <unistd.h> einbinden soll. Davon steht aber nichts im Tutorial und das einbinden führt zu schrecklich langen Fehlermeldung.

    Wo liegt das Problem?

    Danke und Grüße



  • Hat dann wohl kaum was mit C++ zu tun, sondern eher mit Linux, oder?

    Kann das Problem nicht nachvollziehen, es kompiliert ohne Probleme mit #include <unistd.h> .
    Was verwendest du für einen Compiler, und wie sieht der Kompilierungsbefehl aus?

    EDIT: Und wie sehen die ersten Fehlermeldungen aus, die der Compiler ausspuckt?



  • Meine Compilerausgabe:

    gcc version 6.1.1 20160802 (Debian 6.1.1-11)
    

    Zum compilieren verwende ich ein Makefile, welches ich für jedes C++ Programm anpasse:

    Makefile

    .PHONY: all clean
    
    GXX := g++
    GXXFLAGS := -c -g -Wall -std=c++14
    LDFLAGS := -g
    objs := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
    deps := $(objs:.o=.d)
    
    all: SocketAlphaMain
    
    -include $(deps)
    
    SocketAlphaMain: $(objs) 
    	$(GXX) $(LDFLAGS) -o $@ $^
    
    %.d: %.cpp
    	$(GXX) -MM -MT "$@ $(patsubst %.d,%.o,$@)" -MF $@ $< 
    
    %.o: %.cpp
    	$(GXX) $(GXXFLAGS) $<
    
    clean:
    	rm -f $(objs) $(deps)
    	rm -f SocketAlphaMain
    	clear screen && ls -l -a
    

    Die vollständige Fehlerausgabe ist:

    g++ -MM -MT "SocketAlphaMain.d SocketAlphaMain.o" -MF SocketAlphaMain.d SocketAlphaMain.cpp 
    g++ -c -g -Wall -std=c++14 SocketAlphaMain.cpp
    SocketAlphaMain.cpp: In function ‘int main()’:
    SocketAlphaMain.cpp:38:17: error: ‘close’ was not declared in this scope
         close(Socket);
                     ^
    Makefile:20: die Regel für Ziel „SocketAlphaMain.o“ scheiterte
    make: *** [SocketAlphaMain.o] Fehler 1
    


  • Ja, klar unistd.h fehlt ja auch... Du sagtest, mit unistd.h hast Du immernoch Fehler, die wären jetzt interessant.


Anmelden zum Antworten