【问题标题】:How to send HTTP formatted file using C如何使用 C 发送 HTTP 格式的文件
【发布时间】:2014-06-25 12:16:55
【问题描述】:

此时我正在处理我的编程项目,我需要一个使用 C 创建的服务器-客户端协议,在该协议上:

  1. 服务器只是侦听来自其客户端的请求,它只会在收到请求后做出反应。
  2. 客户端使用网络浏览器发出请求。
  3. 在 URL 字段(在浏览器中),用户必须输入“get”,然后输入所需文件的名称。
  4. 服务器将文件作为 http 格式的字符串发送。

谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>


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

    struct servent* port;

    port = getservbyname("cpp_java","tcp");

    printf("Port: %i",port->s_port);

    int descriptor;

    descriptor = socket (AF_INET,SOCK_STREAM,0);

    if(descriptor == -1){
        printf("Error\n");
    }

    struct sockaddr_in direc;
    direc.sin_family = AF_INET;
    direc.sin_port = port->s_port;
    direc.sin_addr.s_addr = INADDR_ANY;

    if(bind(descriptor,(struct sockaddr *)&direc, sizeof(direc)) == -1){
        printf("Error\n");
    }

    if(listen(descriptor,1) == -1){
        printf("Error\n");
    }

    struct sockaddr client;
    int descriptor_client;
    int longi;

    descriptor_client = accept (descriptor, &client, &longi);

    if(descriptor_client == -1){
        printf("Error\n");
    }

    return (EXIT_SUCCESS);
}

这是我到目前为止所做的代码,我已经阅读了很多问题和答案,但我不知道如何为二进制文件调整 HTTP 标头并使用任何浏览器下载它。提前致谢。

注意:如果您能告诉我如何使用 GET 请求资源,我也将不胜感激。

【问题讨论】:

    标签: c file http request transfer


    【解决方案1】:

    在我看来,您正在尝试创建一个简单的 http 服务器。

    • 启动服务器。打开一个套接字,将其绑定到一个接口(例如 localhost),为其分配一个端口(例如 8080)并开始侦听。您发布的代码似乎是这样做的,您需要实现一个在客户端打开连接时要执行的函数。 Here 就是一个例子。

      如果你使用的是linux,你可以使用netcat -l -p 8080在localhost上启动这样一个服务器(用于测试)

    • 之后,您将能够使用浏览器通过键入http://localhost:8080/ 发送http 请求。如果我是正确的,这个 URL 将发送一个 http GET 请求“/”资源。

    • 您可以使用http://localhost:8080/filename 从浏览器发送文件资源的GET 请求。发送到您的服务器的数据如下所示:

      GET /filename HTTP/1.1 Host: localhost:23000 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8

      注意GET /filename

    • 在接受连接时,您将读取 http 请求并对其进行解析。我建议为 c 使用任何 http 解析器库,或者,如果您有一个简单的用例,请手动解析 GET /filename 文本。获取文件名,然后创建一个 http 响应(在页面中嵌入文件内容)并将其写回套接字。浏览器将接收它并显示数据。响应可能如下所示

      <!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML> <HEAD> <TITLE> File requested </TITLE> </HEAD> <BODY> <P>Raw file content goes here</P> </BODY> </HTML>

    【讨论】:

    • 非常感谢。确实,我正在尝试制作服务器。你的答案几乎就是我想要的,比如 99%。关于它的最后一个问题,如果请求是浏览器不知道如何处理的文件,我发回的那个小网页代码会做什么?会提示下载文件吗?
    • 您可以像我上面那样将文件内容嵌入到响应中。您可以更改 http 响应以使其发送文件,或提示下载文件等,请参阅stackoverflow.com/questions/5496200/…
    • 嘿,你能帮我看看如何将数据发送到我的服务器吗?我不知道如何得到你之前写的那些行。
    猜你喜欢
    • 2011-09-01
    • 2016-06-02
    • 2010-11-11
    • 1970-01-01
    • 2017-04-13
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多