En C, lire une page Internet avec un URL complet
Bonjour,
En C je cherche à lire le contenu d'unbe page web. Comme je n'ai pas envie de réinventer la roue, j'ai cherché un code existant qui fait le travail, à base de socket, sans trucs propriétaires, sans "system". Et il fonctionne, je lis mon code HTML. Problème, seulement pour le nom de domains, en l'instance "www.random.org"
alors que l'URL complète est "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=d"
QuestionJe suppose que la partie manquante doit être rentrée dans la description du socket, ou dans l'apell HTTP, mais je ne connais pas la structure de ces variables?
Je ne donne pas en le code qui marche entier, car il est long et il vient d'un site "concurent":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| /* Build the socket. */
protoent = getprotobyname("tcp");
if (protoent == NULL) {
perror("getprotobyname");
exit(EXIT_FAILURE);
}
socket_file_descriptor = socket(AF_INET, SOCK_STREAM, protoent->p_proto);
if (socket_file_descriptor == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
/* Build the address. */
hostent = gethostbyname(hostname);
if (hostent == NULL) {
fprintf(stderr, "error: gethostbyname(\"%s\")\n", hostname);
exit(EXIT_FAILURE);
}
in_addr = inet_addr(inet_ntoa(*(struct in_addr*)*(hostent->h_addr_list)));
if (in_addr == (in_addr_t)-1) {
fprintf(stderr, "error: inet_addr(\"%s\")\n", *(hostent->h_addr_list));
exit(EXIT_FAILURE);
}
sockaddr_in.sin_addr.s_addr = in_addr;
sockaddr_in.sin_family = AF_INET;
sockaddr_in.sin_port = htons(server_port);
/* Actually connect. */
if (connect(socket_file_descriptor, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
/* Send HTTP request. */
nbytes_total = 0;
while (nbytes_total < request_len) {
nbytes_last = write(socket_file_descriptor, request + nbytes_total, request_len - nbytes_total);
if (nbytes_last == -1) {
perror("write");
exit(EXIT_FAILURE);
}
nbytes_total += nbytes_last;
} |
Merci de voir, je sens que peu de choses suffiraient à faire marcher ce code dans mon cas