I am looking for sample c code that connects to a URL.  I tried to cobble
something together but it isn't working out too well.

All it needs to do is connect to a url like "
https://www.example.com/sample?option1=matt%option2=darnell%option3=please_help
"

Does it have to be C code?  If not, you can use a utility like curl
or wget to do the work for you, or you can even use a general utility
like netcat:

   (echo GET /url/here HTTP/1.0; echo) | nc hosthere 80

Anyway, below is some C code.  It's written for a unix system, but
since it looks like you're coding this for windows, I tried to include
hints for converting the code to windows (they use a socket API for
networking access which is similar but not identical to the one used
in unix).

Matt

Tim Newsham
http://www.lava.net/~newsham/


/* in windows you would include <windows.h> and <winsock.h> */
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

/*
 * Things are slightly different in windows.  They use different types
 * for sockets than are used in Unix.  To make it clearer I added the
 * following defines for Unix.  You wouldn't need these in windows.
 **/
#define SOCKET int                      /* a socket handle */
#define INVALID_SOCKET -1               /* A bogus handle indicating error */
#define SOCKET_ERROR -1                 /* error return value */


/* resovle an IPv4 host.  Return 0 for success */
int
resolvHost(char *host, struct sockaddr_in *ad)
{
        struct hostent *hp;

        memset(ad, 0, sizeof ad);
        ad->sin_family = AF_INET;

        /* try it as a dotted-quad */
        ad->sin_addr.s_addr = inet_addr(host);
        if(ad->sin_addr.s_addr != INADDR_NONE)
                return 0;

        /* go to dns */
        hp = gethostbyname(host);
        if(!hp || hp->h_length != 4)
                return -1;
        memcpy(&ad->sin_addr.s_addr, hp->h_addr, 4);
        return 0;
}

int
conUrl(char *host, int port, char *path)
{

        char buf[1024];
        struct sockaddr_in ad;
        SOCKET s;
        int len;

        if(strlen(host) + strlen(path) > 900) {
                fprintf(stderr, "url too long (%s: %s)\n", host, path);
                return -1;
        }

        /* resolve the host then connect to it */
        if (resolvHost(host, &ad) == -1) {
                fprintf(stderr, "bad address %s\n", host);
                return -1;
        }
        ad.sin_port = htons(port);

        s = socket(ad.sin_family, SOCK_STREAM, 0);
        if(s == INVALID_SOCKET) {
                perror("socket");     /* use WSAGetLastError in windows */
                return -1;
        }
        if(connect(s, (struct sockaddr*)&ad, sizeof ad) == SOCKET_ERROR) {
                perror(host);           /* use WSAGetLastError in windows */
                close(s);
                return -1;
        }

        /* send our request */
        sprintf(buf, "GET %s HTTP/1.0\n\n", path);
        send(s, buf, strlen(buf), 0);

        /*
         * read back the result -- this is for testing since you
         * indicated you don't need the resulting text.
         */
        while((len = recv(s, buf, sizeof buf, 0)) > 0)
                write(1, buf, len);
        close(s);                       /* use closesocket in windows */
        return 0;
}

int
main(int argc, char **argv)
{
        /* initialize with WSAStartup in windows */

        if(conUrl("www.lava.net", 80, "/~newsham/") == -1)
                return 1;
        return 0;
}

Reply via email to