使用C在套接字编程中获取请求的地址

sad*_*605 7 c sockets http httpserver

我正在使用这样的东西来创建一个使用C的服务器.当我127.0.0.1:5000从浏览器访问时,我可以看到"Hello Worlds"我将其作为缓冲区发送.但我想127.0.0.1:5000/filename.html工作.但我不知道如何在C filename之后得到它127.0.0.1:5000.

我正在使用它来建立连接:

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons(5000);

  bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));

  connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL);
Run Code Online (Sandbox Code Playgroud)

dre*_*lax 6

浏览器将向您的服务器发送一个HTTP请求,其中包含以后的URL.请求可能如下所示:

GET /filename.html HTTP/1.1
Host: 127.0.0.1:5000
Run Code Online (Sandbox Code Playgroud)

您的C程序必须从套接字读取此请求并解析它以查找URL.请注意,请求可能包含比上述更多的信息,但它应始终以空行结束(因此您知道停止解析的位置).HTTP请求中的行应以回车符和换行符("\r\n")结束.

您通过用于发送数据的同一套接字接收数据.读取HTTP请求的步骤可能是这样的:

  1. 声明一个足够大小的缓冲区,可能是4096字节或更多.

  2. 使用readconnfd直到:将数据读入此缓冲区:

    1. 您收到了4095个字节(在这种情况下,您的服务器应该回复错误413)

    2. 您遇到过字符"\r\n\r\n"(这表示空白行)

    3. 一段时间过去了,上面都没有发生过.为了实现超时,您需要使用select()poll().

  3. 收到缓冲区中的HTTP请求后,解析它:

    1. 第一行是请求行,它指示请求的方法,URI和协议版本号.解析此行的一种可能方法是按空格分割.

    2. 后续行表示HTTP头字段,通常可以解析为Key: Value\r\n.这些标题字段包含cookie,有关发出请求的客户的信息等.

  4. 您还需要形成HTTP 响应.URI指定有效资源(例如filename.html)时的响应可能是:

    HTTP/1.1 200 OK
    Date: Thu, 25 Jul 2013 03:55:00 GMT
    Server: sadaf2605-server/1.0
    Content-Type: text/html
    Content-Length: 40595
    
    < contents of filename.html follows here >
    
    Run Code Online (Sandbox Code Playgroud)

    在上面,Content-Length指的是filename.html文件中的字节数.就像请求一样,使用空行将响应与数据分开.

  • HTTP 1.1在[RFC 2616](http://www.rfc-editor.org/rfc/rfc2616.txt)中指定. (2认同)