0 0

[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协议了~~

不知道有没有更好的方法~~ 请路过的各位大侠多多指教~~ 谢过~~





.
C 
2009年10月09日 18:08

4个答案 按时间排序 按投票排序

0 0

#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
0 0

Invalid HTTP format, parsing fails.

2009年10月15日 11:18
0 0

看看这有没帮助
http://www.iteye.com/topic/368949
http://www.iteye.com/topic/368943

2009年10月10日 15:40
0 0

用libcurl试试

2009年10月10日 12:52

相关推荐

    Linux下用c语言实现发送http请求

    在Linux环境下利用C语言实现HTTP请求的发送是一个深入理解网络编程和HTTP协议的好机会。本文将根据提供的代码片段,详细解析如何在Linux下使用C语言实现HTTP请求的发送,包括必要的头文件、函数定义以及主函数中的...

    c语言实现的httpclient,xcode环境.zip

    本项目“c语言实现的httpclient,xcode环境.zip”显然是一个基于C语言编写的HTTP客户端程序,它允许用户通过C代码发起HTTP请求并与服务器进行通信。Xcode是Apple为开发iOS、macOS以及其他Apple平台的应用程序提供的...

    HttpClient实现POST GET和文件下载

    本篇文章将深入探讨如何利用HttpClient实现这些功能,并提供实战代码示例。 首先,让我们了解GET和POST两种HTTP请求方法的基本概念。GET是HTTP协议中最常见的请求方式,用于获取服务器上的资源,所有数据都包含在...

    java实现httpget和httppost请求httpclient-4.3.1.jar包

    利用httpclient-4.3.1.jar、httpcore-4.3.jar包,很简单的用java实现httpget和httppost请求。

    SpringBoot使用httpclient发送Post请求时

    HttpPost httpPost = new HttpPost(url); StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8")); httpPost.setHeader("Content-type", "application/json"); httpPost.setEntity...

    httpclient post方式发送请求

    总结起来,使用Apache HTTPClient库以POST方式发送JSON数据涉及的主要步骤包括:配置HttpClient实例、创建HttpPost对象、构建JSON实体、设置请求头和执行请求。通过这种方式,你可以方便地与Web服务进行交互,传递...

    MFC的HttpClient的Get和Post方法

    在Microsoft Foundation Class (MFC)库中,HttpClient是用于实现HTTP通信的重要工具,特别是对于发送GET和POST请求。本文将详细讲解如何在MFC中利用HttpClient进行GET和POST操作。 首先,我们需要理解HTTP协议的...

    HttpClient发送http请求(post和get)需要的jar包+内符java代码案例+注解详解

    - 将HttpGet或HttpPost对象添加到HttpClient中执行。 - 获取和解析响应。 3. **示例代码**: ```java // 创建HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // GET请求 ...

    httpclient发送post请求

    本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...

    httpclient post json 数据

    "httpclient post json数据"这个主题就是关于如何使用C#的HttpClient类来向Web API发送POST请求,并且以JSON格式传输数据。下面将详细解释这一过程。 首先,理解JSON(JavaScript Object Notation)是一种轻量级的...

    C语言http客户端通信实现

    在IT行业中,C语言是一种基础且强大的编程语言,被..."http.c"这个文件可能包含了这些实现,可以作为学习和研究C语言HTTP客户端通信的一个实例。通过分析和理解这段代码,你可以更好地掌握网络编程和C语言的基础知识。

    Android使用HttpClient实现上传下载功能并监控进度

    创建请求时,我们可以使用`HttpGet`或`HttpPost`等方法,具体取决于我们的需求。 对于上传功能,我们需要使用`HttpPost`。创建一个`HttpPost`对象,设置URL,然后使用`FileBody`和`MultipartEntity`来添加文件到...

    【最新】C++ 使用libEvent实现http的post, get功能

    下面我们将逐步讲解如何实现GET和POST功能。 1. **初始化libEvent**:在开始使用libEvent之前,需要先初始化环境。调用`event_base_new()`函数创建一个基础事件结构体,这是libEvent的核心。 2. **创建HTTP客户端*...

    httpclient.post例子

    本示例将深入探讨如何使用HttpClient库实现POST请求。首先,我们需要理解POST请求的基本概念,它通常用于向服务器发送数据,比如提交表单或者上传文件。 在`httpclient.jar`包中,主要涉及`org.apache.http.client`...

    轻量级C++实现的httpserver和httpclient

    本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...

    android httpclient文件上传 http协议post get方法向服务器传输数据

    4. **实现细节**:在实际操作中,我们需要先创建`HttpClient`实例,然后创建`HttpPost`对象,设置请求的URL。接着,构建`MultipartEntityBuilder`,添加文件后,将其转化为`HttpEntity`并设置给`HttpPost`。最后,...

    httpClient httpPost httpGet 所需jar包

    - `httpclient.jar`:包含HttpClient的主要实现,提供了基本的HTTP通信功能。 - `httpcore.jar`:HttpClient的核心组件,提供了HTTP协议的基础设施,如连接管理和I/O操作。 - `httpmime.jar`:扩展了HttpClient,...

    实现http协议两端httpserver和httpclient

    在VC++中实现HTTP Server,你需要创建一个监听特定端口的服务器,当接收到客户端的HTTP请求时,解析请求头,根据请求方法(GET、POST等)处理请求,然后构造并返回响应。这涉及到网络编程的知识,如套接字(socket)...

Global site tag (gtag.js) - Google Analytics