Ojs
Ojs

Reputation: 954

C: Sending http get request in linux

I'm trying to make a connection localhost on port 80 and send a simple http get request and simultaneously I run wireshark and look at the headers. Here is my code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>


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

  int yes = 1;
 char buffer[1024];
 int newsockfd, portno, recv_length, sockfd;
 socklen_t clilen;
 struct sockaddr_in serv_addr, cli_addr;
 ssize_t number;
 if (sockfd < 0) 
    error("ERROR opening socket");
 bzero((char *) &serv_addr, sizeof(serv_addr));


  sockfd = socket(AF_INET, SOCK_STREAM, 0);

 serv_addr.sin_family = AF_INET;
 serv_addr.sin_addr.s_addr = 0;
 serv_addr.sin_port = htons(80);




 connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));


 if(send(sockfd, 


 "GET / HTTP/1.1\r\n
 Host: localhost\r\n
 Connection: Keep-alive\r\n
 Cache-Control: max-age=0\r\n
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n
 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n
 Accept-Encoding: gzip, deflate, sdch\r\n
 Accept-Language: en-US,en;q=0.8\r\n\r\n", 

 strlen("GET / HTTP/1.1\r\n
 Host: localhost\r\n
 Connection: Keep-alive\r\n
 Cache-Control: max-age=0\r\n
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n
 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n
 Accept-Encoding: gzip, deflate, sdch\r\n
 Accept-Language: en-US,en;q=0.8\r\n\r\n"),

 0) > 0)

 {
    printf("GET send from %d\n", sockfd);
 }
 else
 {
    printf("Problem in send %s\n", strerror(errno));
 }

But when I compile it and run it gives me a lot of erros. here is the image of errros. After this error I changed the send function to this
send(sockfd, "GET / HTTP/1.1\r\n Host: localhost\r\n\r\n", strlen("GET / HTTP/1.1\r\n Host: localhost\r\n\r\n")
Compilation went ok but the wireshark shows me HTTP/1.0 400 BAD REQUEST (text/html) So I have few questions.
1)What is the difference between send functions that I've used? I mean does it really matter if I send
GET / HTTP/1.1\r\n Host: localhost\r\n\r\n
or
GET / HTTP/1.1\r\n Host: localhost\r\n Connection: Keep-alive\r\n Cache-Control: max-age=0\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n Accept-Encoding: gzip, deflate, sdch\r\n Accept-Language: en-US,en;q=0.8\r\n\r\n
2)How to configure send function to make correct HTTP GET request?
Hope you can help. Thanks.

Upvotes: 2

Views: 7476

Answers (1)

David Schwartz
David Schwartz

Reputation: 182779

You have literal newlines inside your string! You need to close and re-open the quotes on each line. For example:

if(send(sockfd, 
 "GET / HTTP/1.1\r\n"
 "Host: localhost\r\n"
 "Connection: Keep-alive\r\n"
 "Cache-Control: max-age=0\r\n"
 ...

Upvotes: 0

Related Questions