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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h> /* for size_t */
#include <sys/types.h>
#include <errno.h>
#include <winsock2.h>
#define PORT 80
int
demarrer_sockets_windows(void)
{
int err = 0;
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2); // WORD et MAKEWORD sont definis dans windef.h
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("La fonction WSAStartup a echoue.\n");
return err;
}
else if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("Probleme de version des sockets Winsock. "
"Version demandee : 2.2 ; version obtenue %d.%d\n",
LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
return 1;
}
else
{
printf("WSAStarup OK avec Winsock en version 2.2.\n");
return 0;
}
}
void
eteindre_sockets_windows(void)
{
// Dechargement de la DLL socket windows
if( WSACleanup() == SOCKET_ERROR)
printf("WSACleanup KO, mais on ferme quand meme.\n");
}
SOCKET*
connexion_a(const char *hostname)
{
SOCKET *psock = NULL;
struct hostent *hostinfo = NULL;
SOCKADDR_IN sin;
memset( &sin, 0, sizeof(sin)); // mettre tous les champs a 0
// Creation du socket
if( (psock = malloc(sizeof(SOCKET)) ) == NULL )
{
printf("Erreur d'allocation memoire pour le socket.\n"
"Errno : %d = %s", errno, strerror(errno));
return NULL;
}
if( (*psock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET )
{
printf("Creation impossible du socket.\n");
return NULL;
}
// Recuperation des informations sur le serveur (conversion URL -> IP)
if( (hostinfo = gethostbyname(hostname))== NULL )
{
printf ("Erreur : l'hote %s n'est pas reconnu.\n", hostname);
return NULL;
}
// Connexion du socket sur la structure adrese
sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
sin.sin_port = htons(PORT); /* on utilise htons pour le port */
sin.sin_family = AF_INET;
if(connect(*psock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
perror("connect()");
exit(errno);
}
printf("Connexion reussie a %s.\n", hostname);
return psock;
}
int main(int argc, char *argv[])
{
argv=NULL;
argc=0;
SOCKET *psock = NULL;
const char *hote = "http://www.developpez.com";
// Pour commencer
if( demarrer_sockets_windows() != 0)
{
puts("Impossible de demarrer la bibliotheque de sockets.\n");
return EXIT_FAILURE;
}
// Connexion
if( (psock = connexion_a(hote)) == NULL)
{
puts("Impossible de se connecter a l'hote.\n");
return EXIT_FAILURE;
}
// Recuperation de la page
const char *message = "GET /actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.0\n\n";
if( send(*psock, message, (int)strlen(message)+1, 0) < 0)
{
printf("Erreur lors du send : %d", errno);
exit(errno);
}
char buffer[10240];
int n = 0;
if((n = recv(*psock, buffer, sizeof buffer - 1, 0)) < 0)
{
perror("recv()");
exit(errno);
}
else
{
printf("Nb caracteres recu dans le buffer : %d.\n", n);
FILE *fichier = fopen("page.txt", "w");
if(fichier == NULL)
{
perror("Impossible d'ouvrir le fichier");
exit(errno);
}
size_t nb = fwrite(buffer, 1, 1024, fichier);
printf("Nb caracteres ecrits dans le fichier : %d.\n", nb);
}
// Pour finir
eteindre_sockets_windows();
return 0;
} |