connection.c
author Markus Bröker <mbroeker@largo.dyndns.tv>
Tue, 01 Jun 2010 13:13:34 +0200
changeset 128 efa226a4801e
parent 111 2247473fd12d
child 131 b5ad49852adc
permissions -rw-r--r--
That's the proper way to use crypt.h committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * connection.c
 * Copyright (C) 2008 mussolini
 * Copyright (C) 2008 mbroeker
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <netdb.h>
#include <arpa/inet.h>

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

int connection (char *ip, unsigned short port)
{
    struct hostent *hs;
    struct sockaddr_in sock;

    int sockfd;

    memset (&sock, 0, sizeof (sock));
    sock.sin_family = PF_INET;
    sock.sin_port = htons (port);

    if ((sock.sin_addr.s_addr = inet_addr (ip)) == -1) {
        if ((hs = gethostbyname (ip)) == NULL) {
            perror ("[-] Error");
            return -1;
        }
        sock.sin_family = hs->h_addrtype;
        memcpy (&sock.sin_addr.s_addr, hs->h_addr_list[0], hs->h_length);
    }

    if ((sockfd = socket (PF_INET, SOCK_STREAM, 0)) < 0) {
        perror ("[-] Error");
        return -1;
    }

    if (connect (sockfd, (struct sockaddr *)&sock, sizeof (sock)) < 0) {
        perror ("[-] Error ");
        return -1;
    }

    return (sockfd);
}

int main (int argc, char **argv)
{
    char buffer[1024];

    int sockfd;

    int num;

    if (argc != 3) {
        printf ("Usage: %s <ipaddr> <port>\n", argv[0]);
        return EXIT_FAILURE;
    }

    if ((sockfd = connection (argv[1], atoi (argv[2]))) < 0) {
        printf ("Connection error: %s:%d\n", argv[1], atoi (argv[2]));
        return EXIT_FAILURE;
    }

    write (sockfd, "GET /\r\n", 7);

    while ((num = read (sockfd, buffer, 1023)) != 0) {
        buffer[num] = 0;
        printf ("%s", buffer);
    }

    return close (sockfd);
}