【问题标题】:C http server send get requests to my server?C http服务器向我的服务器发送get请求?
【发布时间】:2017-01-28 14:56:11
【问题描述】:

这是我正在学习的服务器:http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.html

我完全不明白获取请求服务器等。如何发送获取请求?我认为我不知道如何执行此操作的原因是所有教程都指向从网站获取请求,而这是从我当前的目录或至少从我的理解中获取的。

这是一项学校作业,我们可以复制此作业的代码,但我们必须找到作者。关键是要了解 Web 服务器是如何工作的,我不了解 Get 请求的作用以及如何在这个特定的服务器中实现它,以便研究它的效果。

谢谢你,下面是我想打的具体代码。我想测试不同的 get 请求,看看我能得到什么响应或错误。

if ( (fd=open(path, O_RDONLY))!=-1 )
{
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0);
    while ( (bytes_read=read(fd, data_to_send, BYTES))>0 )
        write (clients[n], data_to_send, bytes_read);
}
else    write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND

【问题讨论】:

  • 为什么要从服务器发送请求?客户端发送请求,您回复响应。
  • 至于创建请求,只要你的本地浏览器就可以了?或者使用curl之类的命令行工具?
  • 就像我说的我不知道我在做什么,我不知道关于服务器的第一件事。客户发送请求,我回复。我确定这台服务器已经回复了。 curl 命令会是什么样子? stackoverflow.com/questions/27422918/… 显示一个。但是我什至不知道这是否有一个 url 以及它是否会是什么

标签: c webserver get-request


【解决方案1】:

查看HTTP 1.1 RFC #GET 以了解什么是 GET 请求。当您使用浏览器访问网站时(所有网站都运行在某种 HTTP 服务器上),您的浏览器充当客户端,网站充当服务器。客户端发起请求,服务器响应该请求。

请求的主要类型(由浏览器发起,以响应用户尝试查看的 URL)是 GET 请求。

例如,如果用户想要访问 URL http://www.example.com/index.htm,浏览器会连接到服务器 www.example.com 的 TCP 端口 80(默认情况下)。建立连接后,浏览器会使用标准 GET 请求开始“对话”,如下所示:

GET /index.htm HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

第一行(请求行)之后的任何标题都是可选的,尽管任何浏览器总是希望包含“主机”标题,因为大多数网站没有它就无法工作(这允许多个网站共享一个 IP 地址)。在这种情况下,如果不在这里指定主机名,服务器就无法知道您尝试访问的网站。

在该服务器上获取 index.htm 的最低 GET 请求只是:

GET /index.htm HTTP/1.1

请注意,请求的结尾由双 CRLF 序列(ASCII 代码 13 和 10)终止,一个用于最近的标头行,另一个用于标记请求标头的结尾。一旦服务器接收到双 CRLF 序列,服务器就会相应地响应状态行和代码(找到文档了吗?)。如果找到该文档,它通常会在响应中返回,其中包含 HTTP 状态代码 200、响应标头(这些格式与请求标头的格式相同)、双 CRLF 序列,然后是请求文件的正文。 HTTP 标准将此称为“实体”。在这种情况下,返回的实体将是 index.htm 的内容。使用上面的示例,服务器可能会这样响应:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 66
Last-Modified: Wed, 14 Sep 2016 13:05:21 GMT

<html>
<body>
    Welcome to my example page
</body>
</html>

这是一个简单的 HTTP GET/响应对话的简单示例,尽管您可以猜到根据请求和响应标头,事情可能会变得更加复杂。

要回答有关如何手动向正在运行的服务器发送 GET 请求的问题,我喜欢在 linux 机器上使用“curl -i”。 Curl 充当客户端/浏览器,允许您指定要获取(下载)的 URL。例如:

curl -i http://localhost/test.htm

-i 选项使 curl 显示整个 Web 服务器响应(包括 HTTP 响应标头),而不仅仅是在本例中为 test.htm 内容的实体。您只需要调整上面的 URL 以匹配您正在运行的网络服务器的 URL,无论它是在同一台机器上还是在网络上的其他地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多