Skip to content

Instantly share code, notes, and snippets.

@bert
Forked from nolim1t/socket.c
Last active February 10, 2019 04:27
Show Gist options
  • Save bert/4a50b198984d0e543935813370408101 to your computer and use it in GitHub Desktop.
Save bert/4a50b198984d0e543935813370408101 to your computer and use it in GitHub Desktop.
HTTP Request in C using low level write to socket functionality
all: socket.c
gcc socket.c -o soc
clean:
rm -f *~
rm -f *.o
rm -f soc
/*!
* \file socket.c
*
* Compile with:
*
* gcc socket.c -o soc
*
* Invoke as:
*
* ./soc https://www.google.com 80
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
int
socket_connect (char *host, in_port_t port)
{
struct hostent *hp;
struct sockaddr_in addr;
int on = 1, sock;
if ((hp = gethostbyname (host)) == NULL)
{
herror ("gethostbyname");
exit (1);
}
bcopy (hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_port = htons (port);
addr.sin_family = AF_INET;
sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (const char *) &on, sizeof (int));
if (sock == -1)
{
perror ("setsockopt");
exit (1);
}
if (connect (sock, (struct sockaddr *) &addr, sizeof (struct sockaddr_in)) == -1)
{
perror ("connect");
exit (1);
}
return sock;
}
#define BUFFER_SIZE 1024
int
main (int argc, char *argv[])
{
int fd;
char buffer[BUFFER_SIZE];
if(argc < 3)
{
fprintf (stderr, "Usage: %s <hostname> <port>\n", argv[0]);
exit (1);
}
fd = socket_connect (argv[1], atoi (argv[2]));
write (fd, "GET /\r\n", strlen ("GET /\r\n")); /* write(fd, char[]*, len); */
bzero (buffer, BUFFER_SIZE);
while (read (fd, buffer, BUFFER_SIZE - 1) != 0)
{
fprintf (stderr, "%s", buffer);
bzero (buffer, BUFFER_SIZE);
}
shutdown (fd, SHUT_RDWR);
close (fd);
return 0;
}
/* EOF */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment