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.