C读取页面的HTML

时间:2015-08-08 02:45:05

标签: c sockets network-programming

我对网络编程完全陌生。所以我正在开发一个程序,将类似的东西传递给socket:

GET /index.html HTTP/1.1\r\n // index.html is the site being read from
Host: www.google.com\r\n // host can be anything
\r\n

请注意,/ index.html和google.com只是示例。我的程序通过命令行输入替换它们。

所以我将GET消息存储在字符串中,然后使用send()方法将请求发送到服务器。我检查了errno并返回"Success"

对,不是我卡住了,不知道接下来要做什么来阅读HTML。我认为RIO库可以帮助我解决这个问题,但我不知道如何实现后续步骤。

这是我到目前为止所做的:

int open_clientfd(char *hostname, int port)
{
   int clientfd;
   struct hostent *hp;
   struct sockaddr_in serveraddr;

   if ((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
      return -1; /* Check errno for cause of error */

   /* Fill in the server's IP address and port */
   if ((hp = gethostbyname(hostname)) == NULL)
      return -2; /* Check h_errno for cause of error */
   bzero((char *) &serveraddr, sizeof(serveraddr));
   serveraddr.sin_family = AF_INET;
   bcopy((char *)hp->h_addr_list[0],
         (char
          *)&serveraddr.sin_addr.s_addr,
         hp->h_length);
   serveraddr.sin_port = htons(port);

   /* Establish a connection with
    * the server */
   if (connect(clientfd, (SA *)
            &serveraddr,
            sizeof(serveraddr)) < 0)
      return -1;
   return clientfd;
}

void sendRequest(int clientfd, char request[128]) {
   send(clientfd, request, sizeof(request), 0);
   fprintf(stderr, "%s\n", strerror(errno)); // return SUCCESS
}

int main(int argc, char **argv) {
   int clientfd, port;
   char *host, *fileURL, buf[MAXLINE];

   rio_t rio;

   host = argv[1];
   fileURL = argv[2];

   port = atoi(argv[3]);

   clientfd = Open_clientfd(host, port);

   // set up request string
   char request[128]; 

   // ....

   // now request stores the string above

   sendRequest(clientfd, request);
}

1 个答案:

答案 0 :(得分:2)

在下一步中,您可以调用recv或读取

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t read(int fd, void *buf, size_t count);

但是你必须考虑TCP是面向流的protcol。因此,响应可能会返回一个或多个TCP消息。你不能认为它会成为一个,你不知道响应的大小。 read / recv的返回可能不会带来整个HTTP消息。然后你必须阅读,直到你到达HTTP标题的末尾&#34; \ r \ n \ r \ n&#34;。之后,您必须解析到目前为止获得的响应并找到标题Content-Length,获取内容长度,它将为您提供HTTP数据的大小。然后从数据的开头,您阅读Content-Length Bytes。