2016-09-20 374 views
2

这是我学习的服务器:http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.htmlC http服务器发送请求到我的服务器?

我完全不明白get请求服务器之类的东西。我如何发送获取请求?我不认为我知道如何做到这一点的原因是,所有教程都指向从网站获取请求,而这是从我当前的目录或至少从我的理解。

这是一个学校作业,我们被允许为该作业复制代码,但是我们必须找出作者。重点在于了解Web服务器的工作原理,我不理解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 
+1

为什么要从服务器发送*请求*?客户端发送请求,并回复响应。 –

+0

至于创建请求,只需让你的本地浏览器做到这一点?或者使用像'curl'这样的命令行工具? –

+0

就像我说的我不知道我在做什么,我不知道有关服务器的第一件事。客户发送请求,我回复。我确定这个服务器已经有回复。curl命令是什么样的? http://stackoverflow.com/questions/27422918/send-http-get-request-using-curl-in-c显示一个。但是,我甚至不知道这是否有一个网址,如果它做到了 – TheMangaStand

回答

0

查看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地址)。在这种情况下,服务器无法知道您尝试访问的网站,而无需在此处指定主机名。

最低限度GET请求来获取该服务器上的index.htm将仅仅是:

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。例如:

-i选项将导致卷曲以显示整个网络服务器响应(包括HTTP响应报头),而不是仅仅在这种情况下是TEST.HTM的内容的实体。只需要调整上面的URL以匹配正在运行的Web服务器的URL,无论它位于同一台计算机上还是网络上的其他位置。