Télécharger HTTP thru sockets (C)

Récemment, j'ai commencé à prendre des ce guide à me procurer commencé sur le téléchargement de fichiers à partir d'internet. Je l'ai lu et est venu avec le code suivant pour télécharger le corps HTTP d'un site web. Le seul problème est que ça ne fonctionne pas. Le code s'arrête lors de l'appel de l'appel recv (). Il ne plante pas, il continue à courir. Est-ce de ma faute? Suis-je à l'aide de la mauvaise approche? J'ai l'intention d'utiliser le code pour ne pas le télécharger le contenu de .fichiers html, mais aussi de télécharger d'autres fichiers (zip, png, jpg, dmg ...). J'espère qu'il y a quelqu'un qui peut m'aider. C'est mon code:

#include <stdio.h>
#include <sys/socket.h> /* SOCKET */
#include <netdb.h> /* struct addrinfo */
#include <stdlib.h> /* exit() */
#include <string.h> /* memset() */
#include <errno.h> /* errno */
#include <unistd.h> /* close() */
#include <arpa/inet.h> /* IP Conversion */
#include <stdarg.h> /* va_list */
#define SERVERNAME "developerief2.site11.com"
#define PROTOCOL "80"
#define MAXDATASIZE 1024*1024
void errorOut(int status, const char *format, ...);
void *get_in_addr(struct sockaddr *sa);
int main (int argc, const char * argv[]) {
int status;
//GET ADDRESS INFO
struct addrinfo *infos; 
struct addrinfo hints;
//fill hints
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
//get address info
status = getaddrinfo(SERVERNAME, 
PROTOCOL, 
&hints, 
&infos);
if(status != 0)
errorOut(-1, "Couldn't get addres information: %s\n", gai_strerror(status));
//MAKE SOCKET
int sockfd;
//loop, use first valid
struct addrinfo *p;
for(p = infos; p != NULL; p = p->ai_next) {
//CREATE SOCKET
sockfd = socket(p->ai_family, 
p->ai_socktype, 
p->ai_protocol);
if(sockfd == -1)
continue;
//TRY TO CONNECT
status = connect(sockfd, 
p->ai_addr, 
p->ai_addrlen);
if(status == -1) {
close(sockfd);
continue;
}
break;
}
if(p == NULL) {
fprintf(stderr, "Failed to connect\n");
return 1;
}
//LET USER KNOW
char printableIP[INET6_ADDRSTRLEN];
inet_ntop(p->ai_family,
get_in_addr((struct sockaddr *)p->ai_addr),
printableIP,
sizeof(printableIP));
printf("Connection to %s\n", printableIP);
//GET RID OF INFOS
freeaddrinfo(infos);
//RECEIVE DATA
ssize_t receivedBytes;
char buf[MAXDATASIZE];
printf("Start receiving\n");
receivedBytes = recv(sockfd, 
buf, 
MAXDATASIZE-1, 
0);
printf("Received %d bytes\n", (int)receivedBytes);
if(receivedBytes == -1)
errorOut(1, "Error while receiving\n");
//null terminate
buf[receivedBytes] = '\0';
//PRINT
printf("Received Data:\n\n%s\n", buf);
//CLOSE
close(sockfd);
return 0;
}
void *get_in_addr(struct sockaddr *sa) {
//IP4
if(sa->sa_family == AF_INET)
return &(((struct sockaddr_in *) sa)->sin_addr);
return &(((struct sockaddr_in6 *) sa)->sin6_addr);
}
void errorOut(int status, const char *format, ...) {
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
exit(status);
}
Si l'intention est de téléchargement de fichiers, pas de la mise en œuvre de HTTP, vous seriez mieux d'utiliser une bibliothèque comme cURL: curl.haxx.se

OriginalL'auteur v1Axvw | 2010-08-01