Anfänger Socket Frage
-
Hallo,
ich mache gerade meine ersten Gehversuche mit C. Habe leider zum Thema Sockets nicht das passende gefunden...
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { int socket_nummer; int laenge; int anzahl; int ergebnis; struct sockaddr_in adresse; char empfangene_zeichen[65000]; unsigned short int portnummer = 80; char ip_adresse[] = "127.0.0.1"; char befehl[] = "GET /test.txt HTTP://1.0\r\nHost: PC\r\n\r\n"; socket_nummer = socket(AF_INET, SOCK_STREAM, 0); adresse.sin_family = AF_INET; adresse.sin_addr.s_addr = inet_addr(ip_adresse); adresse.sin_port = htons(portnummer); laenge = sizeof(adresse); ergebnis = connect(socket_nummer, (struct sockaddr *)&adresse, laenge); if(ergebnis == 0) { printf("Verbindungsaufbau erfolgreich \n"); printf(", sende HTTP-Befehl:\n\n%s", befehl); anzahl = write(socket_nummer, befehl, sizeof(befehl)); printf("es wurden %d Zeichen gesendet", anzahl); anzahl = read(socket_nummer, empfangene_zeichen, sizeof(empfangene_zeichen)); printf("\n\n%s", empfangene_zeichen); } else { perror("\n Fehler beim Verbindungsaufbau"); } close(socket_nummer); printf("\n\n"); }
Den Code habe ich aus einem meiner Bücher. Leider wird da nur die Vorgehensweise mittels IP Adresse behandelt, nicht aber wie ich eine Verbindung zu einem Server über den Domainnamen herstellen kann. Kann mir da evtl. jemand weiterhelfen? Bin für jeden Denkanstoß dankbar.
cu janedoe
-
edit:
war Müll, die #includes schauen ned nach Windows aus.Da wäre dann ein
gethostbyname das was du brauchst.
-
damit kann ich (wenn ich richtig liege) den namen in die IP auflösen. Wie finde ich dann aber eine datei von einer bestimmten domain wenn auf der IP mehrere Domains liegen???
thanx janedoe
-
Ich glaube du würfelst hier etwas durcheinander. Dein Buch behandelt Netzwerkverbindungen über Sockets, in diesem Fall über das TCP/IP-Protokoll. Dort gibt es IP-Nummern, Hostnamen und Domainnamen. Ein Rechner wird durch eine IP repräsentiert, zu einer IP kann es einen Hostnamen geben. Der Domainname ist Teil des vollqualifizierten Hostnamens.
Was Du vermutlich meinst ist eine NT-Domain, dessen Server ist der Primary Domain Controller. Hier wird mit einem anderen Protokoll (SMB/CIFS) kommuniziert welches zwar auf TCP/IP aufsetzen kann (und es heutzutage auch meist tut), aber auch auf anderen, früher z.B. oft NetBEUI oder IPX.
PS: Mal ganz nebenbei dürfte nichts davon direkt dem ANSI-C-Standard zugeordnet werden können
-
char befehl[] = "GET /test.txt HTTP/1.1\r\nHost: PC\r\n\r\n";
ohne doppelpunkt nach dem HTTP und mit einem slash und mit 1.1 und statt PC hat da der name des hosts/domain auf der anderen seite zu stehen.
lies das rfc ueber http.
LordJaxom: wie um alles in der welt kommst du jetzt auf NT? ich bin nur verwirrt, nichts weiter...
-
Weiss auch nicht, vermutlich wegen den Domains
In dem Fall meint janedoe doch wohl eher mehrere Virtual Hosts die auf eine IP liegen
-
jo jo jo... du hast mich genau richtig verstanden :))) thanx a lot.
hätte ich eigentlich selbst drauf kommen müssen. ist alles halt noch ein wenig ungewohnt. ich will von der sache her das gleiche als wenn ich mit php die funktion fsockopen benutzen würde. auf alle fälle bin ich nun mal eine ganze ecke weiter. ich weiß nicht wie es unter c ist aber bei php bin ich mit http/1.0 in etwa 3 mal so schnell als mit http/1.1 werde ich mal testen. Ist es eigentlich unbedingt erforderlich die IP aufzulösen und mit zu übergeben, oder reicht evtl. auch der domainname? in php (fsockopen) brauche ich die IP ja nicht.auf alle fälle erst mal danke für eure bemühungen
cu janedoe
-
achso...
ohne doppelpunkt nach dem HTTP und mit einem slash
logisch, steht auch so nicht im buch war meine schuld. kommt davon wenn man die ganze zeit adressen in den browser tippt ;))
cu
-
janedoe:
ich weiss nicht, ob bei get http/1.0 auch ein host: erlaubt ist. probiers aus oder lies im RFC.
wenn du mit connect() verbindest, brauchst du ne ip. wenn du nur nen hostnamen hast, musst du den vorher aufloesen.
php mit seinen wrappern etc macht einem da vieles leichter, ist aber auch ne scriptsprache.gethostbyname() brauchst du
-
ja ok viele funktionen sin gleich oder ähnlich wie in php http/1.0 funktioniert auch in c habs schon probiert.
kannst du mir evtl. nen vernünftigen c editor empfehlen? ich verwende für meine php scripte CF5 und bin an das color coding gewöhnt. ist ne ganz schöne umstellung dass variablen funktionen usw. nun alles schwarz ist (unübersichtlich). ich habe mal ein bisschen mit flowchart 3.5 umhergescriptet, ist aber nicht so die wucht.
eine frage noch...
ich versuche gerade einen spider für internetseieten zu bauen und hatte da mal irgendwas von threads gelesen. hast du mal nen link oder oder ein paar tips wo man sich da mal belesen könnte was am schnellsten funktioniert??? müsste nur wissen in welche richtung ich da denken soll...danke sagt
janedoe
-
unter windows nehm ich textpad (shareware).
threads:
du hast die wahl zwischen windows threads (winapi) und irgendeiner windows-implementation von posix threads (pthreads) (evtl mittels cygwin).
lesestoff hab ich dazu nicht, aber das laesst sich schon finden.
-
also schreiben tu ich die programme unter windows. aber compilieren und laufen müssen diese unter linux. ich merk schon, da hab ich wohl noch ein paar stünchen vor mir.
vielleicht kannst du mir aber noch bei einer sache weiterhelfen..
und zwar ist das ne geschichte die mein vorhaben mit php bisher zum scheitern gebracht hat und ich da auch nach etlichen stunden und diskusionen nicht weiter gekommen bin. der unten stehende code funktioniert. allerdings ich die adresse nicht erreichbar und liefert auch keinen status. das problem ist dass es sowohl in php als auch in c ca. ne minute dauert bis das script abbricht. in php mit fsockopen bekomme ich es nicht hin dass ich einen timeout setzten kann. hast du vielleicht ne möglichkeit zur hand wie ich das unter c beispielsweise nach 5 sekunden abbrechen kann???#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { int socket_nummer; int laenge; int anzahl; int ergebnis; struct sockaddr_in adresse; char empfangene_zeichen[65000]; unsigned short int portnummer = 80; char ip_adresse[] = "62.4.80.54"; char befehl[] = "GET /reak-pc/index.php HTTP/1.0\r\nHost: PC\r\n\r\n"; socket_nummer = socket(AF_INET, SOCK_STREAM, 0); adresse.sin_family = AF_INET; adresse.sin_addr.s_addr = inet_addr(ip_adresse); adresse.sin_port = htons(portnummer); laenge = sizeof(adresse); ergebnis = connect(socket_nummer, (struct sockaddr *)&adresse, laenge); if(ergebnis == 0) { printf("Verbindungsaufbau erfolgreich \n"); printf(", sende HTTP-Befehl:\n\n%s", befehl); anzahl = write(socket_nummer, befehl, sizeof(befehl)); printf("es wurden %d Zeichen gesendet", anzahl); anzahl = read(socket_nummer, empfangene_zeichen, sizeof(empfangene_zeichen)); printf("\n\n%s", empfangene_zeichen); } else { perror("\n Fehler beim Verbindungsaufbau"); } close(socket_nummer); printf("\n\n"); }
war jetzt wirklich die letzte frage
nochmal 1000 thx
cu janedoe
-
wenn du im browser mal das hier aufrufst:
http://62.4.80.54/freak-pc/index.php
siehst du was ich meine, da passiert das gleichecu janedoe
-
dafuer eignet sich setsockopt(). http://www.openbsd.org/cgi-bin/man.cgi?query=setsockopt&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
-
ok. danke ich schaus mir morgen mal an...
hab jetzt ca 20 stunden hinter mir. nichts geht mehr...cu jane