C chat-telnet?
-
hallo mal wieder. Ich möchte so eine art wget in C schreiben. d.h, das Programm soll sich mit einem Server verbinden, GET /index.html senden und die Rückgabe ausgeben. Ich habe mir mir Bejees Network tutorial durchgelesen, aber check noch nicht ganz, wie ich einen Befehl an den Server senden kann, und die Antwort in STDOUT drucke.
-
lies beejs tutorial so lange, bis du es verstanden hast. was einfacheres als beejs network guide gibts fast nicht, also streng dich mal an.
-
Ich habs ja verstanden, nur verstehe ich nicht, warum das nicht läuft: Der Server sollte eigentlich was zurückgeben, aber das tut er nicht (bzw der client zeigts nicht an. Weis jemand warum?
client:
{ int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ &sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n", \ inet_ntoa(their_addr.sin_addr)); if (!fork()) { /* this is the child process */ if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ } }
server:
{ int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ &sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n", \ inet_ntoa(their_addr.sin_addr)); if (!fork()) { /* this is the child process */ if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ } }
-
sry, das mit emacs und dem kopieren klappt irgendwie nicht so. Egal, schon gelöst
-
OK, jetzt hängts nur noch an einer Stelle. Das htmlfile wird nicht ausgegeben. Der Fehler muss wohl irgendwo hier liegen. Ich sende Folgendes an eine webaddresse:
if (connect(sockfd, (struct sockaddr *)&their_addr, \ sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if (send(sockfd, "GET / HTML/1.1\n",15,0) == -1) { perror("send");} if (send(sockfd, ("Host: %s\n",argv[1]), (7+(strlen(argv[1]))), 0) == -1){ perror("send"); close(sockfd); exit(0); } if (send(sockfd, "\n",1,0) == -1) { perror("send");} if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); close(sockfd); exit(1); } buf[numbytes] = '\0'; printf("%s",buf);
Kann mir jemand sagen, warum da kein HTML ausgegeben wird?
-
\r\n statt \n
-
und am Ende zwei mal \r\n
Also:
GET / HTML/1.1\r\n Host: host\r\n\r\n
-
'/n/n' wird doch bei allen standard Webservern benutzt. Richtig?
MfG,
ptI
-
ptI schrieb:
'/n/n' wird doch bei allen standard Webservern benutzt. Richtig?
MfG,
ptIfalsch!
-
Hallo,
wo finde ich das
Bejees Network tutorial??
Danke und Gruß
-
ptI schrieb:
'/n/n' wird doch bei allen standard Webservern benutzt. Richtig?
MfG,
ptIIn der RFC zu HTTP steht drinnen, dass man '/n/r' benutzen muss. Wenn du also einen Webserver triffst, der sich strikt an die RFC haltet dann funkt \n\n nicht!
-
\r\n ist es laut der RFC. In der RFC steht aber auch das ein Server nur \n akzeptieren sollte.