Furbby | Bonjour,
Je souhaite appeler depuis un programme en C++ une url sur un serveur web distant, par exemple http://www.monsite.com/maj.php?valeur=2
J'ai pensé à l'utilisation d'un socket pour pouvoir communiquer vers l'extérieur.
J'ai testé un bout de code trouvé sur le net afin de comprendre comment fonctionne un socket et j'avoue être un peu perdu, d'autant que j'ai juste une réaction en appelant google et uniquement au niveau de l'entête, bref j'ai besoin d'un petit coup de main !
Voici le source
Code :
- #ifndef _WINSOCKAPI_
- #include <winsock.h>
- #endif
- #include <stdafx.h>
- #include <windows.h>
- #include <stdio.h>
- #include <initguid.h>
- #include <errno.h>
- #include <signal.h>
- #include <tchar.h>
- #pragma comment(lib, "ws2_32.lib" )
- #define PACKET_SIZE 1024
- void bcopy( void * source, void * destination, int size )
- {
- char * src = ( char * ) source;
- char * dst = ( char * ) destination;
- for( int i=0; i<size; i++ )
- dst[i] = src[i];
- }
- void bzero( void * destination, int size )
- {
- char * dst = ( char * ) destination;
- for( int i=0; i<size; i++ )
- dst[i] = 0x00;
- }
- void init(void);
- void appli();
- int writen(int fd, char *ptr, int n);
- int to_server_socket = -1;
- char server_name[100]; /* nom du host du serveur */
- int port;
- char request_host[PACKET_SIZE];
- char request_path[PACKET_SIZE];
- void main (int argc, char *argv[])
- {
- struct sockaddr_in serverSockAddr; /* addresse de la socket */
- struct hostent *serverHostEnt; /* description du host serveur */
- struct in_addr addr;
- long hostAddr; /* addr du serveur */
- WSADATA wsaData;
- WORD wVersionRequested;
- WSADATA wsa_data;
- int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
- if (!err)
- {
- /* if ( argc == 5 ) {
- sprintf(server_name,argv[1]);
- sscanf(argv[2],"%d",&port);
- sprintf(request_host,argv[3]);
- sprintf(request_path,argv[4]);
-
- }
- else
- exit(1);
- */
- sprintf(server_name,"localhost" );
- sscanf("80","%d",&port);
- sprintf(request_host,"http://www.google.fr" );
- //sprintf(request_host,"209.85.227.106" );
- sprintf(request_path,"/" );
- printf("CONF %s %d %s %s\n",server_name,port,request_host,request_path);
- wVersionRequested = MAKEWORD( 2, 2 );
- err = WSAStartup( wVersionRequested, &wsaData );
- if ( err != 0 ) {
- printf("ca chie WSAStartup : %X\n",WSAGetLastError());
- exit(1);
- }
- /* initialise a zero serverSockAddr */
- bzero(&serverSockAddr,sizeof(serverSockAddr));
- /* converti l'adresse ip 9.100.1.1 en entier long */
- hostAddr = inet_addr(server_name);
- if ( (long)hostAddr != (long)-1)
- bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
- else /* si on a donne un nom */
- {
- serverHostEnt = gethostbyname(server_name);
- if (serverHostEnt == NULL)
- {
- printf("ca chie gethost : %X\n",WSAGetLastError());
- exit(0);
- }
- printf("host_ip: " );
- for(int i = 0; serverHostEnt->h_addr_list[i]; i++)
- {
- addr.s_addr = *(DWORD*) serverHostEnt->h_addr_list[i];
- printf( "%s\t", inet_ntoa(addr));
- }
- printf("\n" );
- bcopy(serverHostEnt->h_addr,
- &serverSockAddr.sin_addr,serverHostEnt->h_length);
- }
- serverSockAddr.sin_port = htons(port); /* host to network port */
- serverSockAddr.sin_family = AF_INET; /* AF_*** : INET=internet */
- serverSockAddr.sin_addr.s_addr = inet_addr("209.85.227.106" );
- /* creation de la socket */
- if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
- {
- printf("ca chie creation socket client\n" );
- exit(0);
- }
- /* requete de connexion */
- if(connect(to_server_socket,(struct sockaddr *)&serverSockAddr,
- sizeof(serverSockAddr))<0)
- {
- printf("ca chie demande de connection\n" );
- exit(0);
- }
- appli();
- /* fermeture de la connection */
- shutdown(to_server_socket,2);
- closesocket(to_server_socket);
- WSACleanup( );
- }
- }
- int readn(int fd, char *ptr, int n);
- void appli (void) {
- char buffer[PACKET_SIZE+1];
- char line[PACKET_SIZE+2];
- int rc;
- int i = 0;
- static int isEntete = 1;
- char *finEntete;
- FILE *bulk, *entete;
- sprintf(buffer,"Vide\n" );
- sprintf(line,"GET %s HTTP/1.1\r\n"
- "Host: %s\r\n"
- // "Accept: image/gif, image/x-xbitmap, image/jpeg,"
- // " image/pjpeg, image/png, */*"
- "\r\n\r\n"
- ,request_path,request_host);
- if ( ( bulk = fopen("bulkhttp","wb" )) == NULL ) {
- printf ( "can't open file to write bulk\n" );
- exit(1);
- }
- if ( ( entete = fopen("entete","wb" )) == NULL ) {
- fclose(bulk);
- printf ( "can't open file to write entete\n" );
- exit(1);
- }
- send(to_server_socket,line,strlen(line)+1,0);
- do {
- rc = readn(to_server_socket,buffer,PACKET_SIZE);
- if ( isEntete == 1 ) {
- finEntete = (char *)strstr(buffer,"\r\n\r\n" );
- if ( finEntete != NULL ) {
- *finEntete = 0x00;
- fwrite(buffer,1,strlen(buffer),entete);
- fwrite(finEntete+4,1,rc-strlen(buffer)-4,bulk);
- isEntete = 0;
- }
- else
- fwrite(buffer,1,rc,bulk);
- fclose(entete);
- }
- else
- fwrite(buffer,1,rc,bulk);
- } while ( rc != 0 ) ;
- fclose(bulk);
- }
- int writen(int fd, char *ptr, int n)
- {
- int nl, nw;
- nl = n;
- while ( nl > 0 ) {
- nw = send(fd, ptr, nl,0);
- if ( nw <= 0 )
- return nw; /*error*/
- nl -= nw;
- ptr += nw;
- }
- return (n-nl);
- }
- int readn(int fd, char *ptr, int n){
- int nl, nr;
- nl = n;
- while ( nl > 0 ) {
- nr = recv(fd,ptr,nl,0);
- if (nr < 0 )
- return nr; /*error*/
- else
- if ( nr == 0 )
- break;
- nl -= nr;
- ptr += nr;
- }
- }
|
Si je ne force pas à la ligne 121 l'adresse ip, le nom n'est pas résolu et j'obtiens une erreur.
Mais même avec cette bidouille, seul le fichier entête généré est alimenté.
Voici le contenu du fichier d'entête :
Code :
- HTTP/1.1 302 Found
- Location: http://www.google.fr/
- Cache-Control: private
- Content-Type: text/html; charset=UTF-8
- Set-Cookie: PREF=ID=4861fc427cd617d0:TM=1256465687:LM=1256465687:S=v0S3inq215Ip8WMs; expires=Tue, 25-Oct-2011 10:14:47 GMT; path=/; domain=.google.com
- Set-Cookie: NID=28=BZTeQcdHXt9dsERJzLxy0-jz05dZs95-SmLtSLT-TxK1vWzZkTBOUcLSWZbfLW2QC8LKjcCpoiiOPTtU2A8-e8RZEGTr255JHHFFlHz8AmBpiTTY8MDVggeYoVd927R_; expires=Mon, 26-Apr-2010 10:14:47 GMT; path=/; domain=.google.com; HttpOnly
- Date: Sun, 25 Oct 2009 10:14:47 GMT
- Server: gws
- Content-Length: 218
- X-XSS-Protection: 0
|
|