-
[C] 类似于HttpClient的C语言实现Http POST功能如何实现?5
想自己写个客户端,模拟浏览器向服务器(如lighttpd等)上传数据。用HTTPrequest抓了包,以下为发送的数据内容:
引用POST /upload.php HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Content-Length: 180
Host: 192.168.1.180
Content-Type: application/x-www-form-urlencoded
-----------------------------7d93a924b05a2
Content-Disposition: form-data; name="upload_file"; filename="C:\tmp\hello.txt"
Content-Type: text/plain
在实现时,代码大致如下:
#include<stdio.h> #include<string.h> #include<sys/socket.h> #include<stdlib.h> #include<netinet/in.h> // post a big file #define Req "POST /upload.php HTTP/1.0\r\n" \ "Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjepg, application/vnd.ms-excel, application/msword, applicationvnd.ms-powerpoint, */*\r\n" \ "Accept-Language:en-us\r\n" \ "Accept-Encoding:gzip, deflate\r\n" \ "User-Agent:Mozilla/4.0\r\n" \ "Host:192.168.1.180\r\n" \ "Content-Type:application/x-www-urlencoded\r\n" \ "-----------------------------7d91a515b05a2\r\n" \ "Content-Disposition:form-data;name=\"upload_file\";filename=\"tmp.gz\"\r\n" \ "Content-Type:application/x-gzip\r\n" #define DST_IP "192.168.1.180" #define ReqLen sizeof(Req) int main() { struct sockaddr_in srv; int sock, nbytes; char sndbuf[1024] = {0}; char recbuf[1024] = {0}; if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "socket() error!\n"); exit(1); } srv.sin_family = AF_INET; srv.sin_addr.s_addr = inet_addr(DST_IP); srv.sin_port = htons(80); if((connect(sock, (struct sockaddr *)&srv, sizeof(struct sockaddr))) == -1) { printf("connect() error!\n"); exit(1); } strncpy(sndbuf, Req, ReqLen); if(write(sock, sndbuf, ReqLen) == -1) { fprintf(stderr, "write() error!\n"); exit(1); } // get response int bytes; while(1) { nbytes = read(sock, recbuf, 1023); if(nbytes < 0) break; recbuf[nbytes] = '\0'; printf(recbuf); } close(sock); return 0; }
先怀疑对HTTP请求的数据封装的格式不对,每次运行client,总会提示400-bad request!这样的错误~~
原本的目标是向lighttpd服务器上传数据(文件较大,一般不小于1G),然后在服务器自己写个cgi来接受/处理数据。现在对上传这部分很头大,看了好久http协议了~~
不知道有没有更好的方法~~ 请路过的各位大侠多多指教~~ 谢过~~
.
2009年10月09日 18:08
4个答案 按时间排序 按投票排序
-
#define Req "POST /upload HTTP/1.0\r\n" \
"Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjepg, application/vnd.ms-excel, application/msword, applicationvnd.ms-powerpoint, */*\r\n" \
"Accept-Language:en-us\r\n" \
"Accept-Encoding:gzip, deflate\r\n" \
"User-Agent:Mozilla/4.0\r\n" \
"Host:192.168.1.108:3000\r\n" \
"Content-Type:multipart/form-data, boundary=----1234567--\r\n\r\n" \
"Content-Length: 13\r\n" \
"----1234567--\r\n" \
"Content-Disposition:form-data;name=\"upload_file\";filename=\"tmp.gz\"\r\n" \
"Content-Transfer-Encoding: binary\r\n" \
"Content-Type:application/x-gzip\r\n\r\n" \
"replace content"
用用这个头试试2009年10月15日 11:48
-
看看这有没帮助
http://www.iteye.com/topic/368949
http://www.iteye.com/topic/3689432009年10月10日 15:40
相关推荐
在Linux环境下利用C语言实现HTTP请求的发送是一个深入理解网络编程和HTTP协议的好机会。本文将根据提供的代码片段,详细解析如何在Linux下使用C语言实现HTTP请求的发送,包括必要的头文件、函数定义以及主函数中的...
本项目“c语言实现的httpclient,xcode环境.zip”显然是一个基于C语言编写的HTTP客户端程序,它允许用户通过C代码发起HTTP请求并与服务器进行通信。Xcode是Apple为开发iOS、macOS以及其他Apple平台的应用程序提供的...
本篇文章将深入探讨如何利用HttpClient实现这些功能,并提供实战代码示例。 首先,让我们了解GET和POST两种HTTP请求方法的基本概念。GET是HTTP协议中最常见的请求方式,用于获取服务器上的资源,所有数据都包含在...
利用httpclient-4.3.1.jar、httpcore-4.3.jar包,很简单的用java实现httpget和httppost请求。
HttpPost httpPost = new HttpPost(url); StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8")); httpPost.setHeader("Content-type", "application/json"); httpPost.setEntity...
总结起来,使用Apache HTTPClient库以POST方式发送JSON数据涉及的主要步骤包括:配置HttpClient实例、创建HttpPost对象、构建JSON实体、设置请求头和执行请求。通过这种方式,你可以方便地与Web服务进行交互,传递...
在Microsoft Foundation Class (MFC)库中,HttpClient是用于实现HTTP通信的重要工具,特别是对于发送GET和POST请求。本文将详细讲解如何在MFC中利用HttpClient进行GET和POST操作。 首先,我们需要理解HTTP协议的...
- 将HttpGet或HttpPost对象添加到HttpClient中执行。 - 获取和解析响应。 3. **示例代码**: ```java // 创建HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // GET请求 ...
本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...
"httpclient post json数据"这个主题就是关于如何使用C#的HttpClient类来向Web API发送POST请求,并且以JSON格式传输数据。下面将详细解释这一过程。 首先,理解JSON(JavaScript Object Notation)是一种轻量级的...
在IT行业中,C语言是一种基础且强大的编程语言,被..."http.c"这个文件可能包含了这些实现,可以作为学习和研究C语言HTTP客户端通信的一个实例。通过分析和理解这段代码,你可以更好地掌握网络编程和C语言的基础知识。
创建请求时,我们可以使用`HttpGet`或`HttpPost`等方法,具体取决于我们的需求。 对于上传功能,我们需要使用`HttpPost`。创建一个`HttpPost`对象,设置URL,然后使用`FileBody`和`MultipartEntity`来添加文件到...
下面我们将逐步讲解如何实现GET和POST功能。 1. **初始化libEvent**:在开始使用libEvent之前,需要先初始化环境。调用`event_base_new()`函数创建一个基础事件结构体,这是libEvent的核心。 2. **创建HTTP客户端*...
本示例将深入探讨如何使用HttpClient库实现POST请求。首先,我们需要理解POST请求的基本概念,它通常用于向服务器发送数据,比如提交表单或者上传文件。 在`httpclient.jar`包中,主要涉及`org.apache.http.client`...
本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...
4. **实现细节**:在实际操作中,我们需要先创建`HttpClient`实例,然后创建`HttpPost`对象,设置请求的URL。接着,构建`MultipartEntityBuilder`,添加文件后,将其转化为`HttpEntity`并设置给`HttpPost`。最后,...
- `httpclient.jar`:包含HttpClient的主要实现,提供了基本的HTTP通信功能。 - `httpcore.jar`:HttpClient的核心组件,提供了HTTP协议的基础设施,如连接管理和I/O操作。 - `httpmime.jar`:扩展了HttpClient,...
在VC++中实现HTTP Server,你需要创建一个监听特定端口的服务器,当接收到客户端的HTTP请求时,解析请求头,根据请求方法(GET、POST等)处理请求,然后构造并返回响应。这涉及到网络编程的知识,如套接字(socket)...