C Socket服务器编程发送文件

标签 c sockets curl

我目前在使用 C 套接字编程时遇到了麻烦。我需要使用以下 curl 命令作为客户端行为来从服务器请求文件。

curl -v SERVER_ADDRESS --request-target FILENAME 从服务器发送

到目前为止,我已经能够创建服务器、解析 header 并处理 PUT 请求。但是我在处理 GET 请求时遇到了问题,该请求正在将文件从服务器发送到客户端。我的代码不会在客户端创建、打开和写入文件。这是我无法解决的部分。

    //cl is value returned by accept()
       fd = open(name, O_RDONLY);
       if (fd<0){
         write(cl, "HTTP/1.1 404 Not Found\r\n", sizeof("HTTP/1.1 404 Not Found\r\n"));
         close(cl);
       }
       else{
         contentLength = 0;
         temp = read(fd, newbuffer, 32768);
         while(temp>0){
           write(cl, newbuffer, temp);
           contentLength = contentLength+temp;
           temp = read(fd, newbuffer, 32768);
         }
      sprintf(message, "HTTP/1.1 200 OK\r\nContent-Length: %d", contentLength);
      strcat(message, "\r\n\r\n");
      write(cl, message, sizeof(message));

感谢帮助。

最佳答案

HTTP header 包含状态行和 header 字段,包括 Content-length的 body 。 HTTP 正文必须跟在 header 之后。但是您的代码会打开文件并立即将内容写入客户端,只有在完成此操作后您才能写入 header 。换句话说:您在标题之前写正文,而不是在标题之后写正文。

除此之外写标题也是错误的:sizeof(message)不是消息的长度,而是缓冲区或指针的大小(不清楚,因为您显示的内容中没有声明 message)。

关于C Socket服务器编程发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58574496/

相关文章:

c - 如果-否则问题

C套接字,第一个连接的线程关闭剩余的

linux - 如何使用 Linux 命令在 Jenkins 控制台中提取 testNG 结果

powershell - 带有删除选项的 Curl 命令引发异常

java - Android从python服务器中的套接字接收消息

windows - Windows 7 中的自签名证书问题 - 替代解决方案/提示

c - 从堆栈读取时出现段错误

java - 避免算术溢出

c++ - 用于在 linux 中获取 CPU 负载的 C API

java - 套接字和 Java 聊天