HTTP Client

<span style="font-family: Arial, Helvetica, sans-serif;">#pragma once</span>
#include "stdio.h"  
#include "afxwin.h"
#include "afxinet.h"
#include "WinSock2.h"  
#include "iostream"  
using namespace std;  
#pragma comment(lib,"ws2_32.lib") 

class CUpload
{
public:
	CUpload(void);
	~CUpload(void);
private:
	long l_file_len;  
	/编码转换/
	char	* m_lpUTF8;			//UTF8编码缓存指针
	char	* m_lpMultiByte;	//Multil多字节编码指针
	wchar_t	* m_wpWideChar;		//Widechar编码缓存指针
	int		m_nUTF8Len;	
	int		m_nMultiByteLen;
	int		m_nWideCharLen;
public:
	bool Send_File(LPCTSTR lpszServer,LPCTSTR lpszAddr,int Server_Port,LPCTSTR File_Name);
	bool UploadFile(LPCTSTR lpszServer,LPCTSTR lpszAddr,LPCTSTR fileUrl,int Server_Port);
	bool Read_FileInfo(char **buffer,LPCSTR file);
	CHttpConnection* m_pConnection;
	CString MakeRequestHeaders(CString& strBoundary);
	CString MakePreFileData(CString& strBoundary, CString& strFileName, int iRecordID);
	CString MakePostFileData(CString& strBoundary);
	void WideCharToUTF8(LPCWSTR wpWideData, int WideLen);
};


//.cpp
#include "StdAfx.h"
#include "Upload.h"
#include <iostream>
#include <io.h>
#include <string>
using namespace std;
CUpload::CUpload(void)
{
	m_lpUTF8=NULL;
}
CUpload::~CUpload(void)
{
}

bool CUpload::Send_File(LPCTSTR lpszServer,LPCTSTR lpszAddr,int Server_Port,LPCTSTR File_Name)
{
	WORD wVersionRequested=MAKEWORD(2,2);  
	WSADATA wsaData;  
	if(WSAStartup(wVersionRequested,&wsaData))  
	{  
		return false;
	}  
	if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wHighVersion)!=2)  
	{  
		return false;
	}  
	UploadFile(lpszServer,lpszAddr,File_Name,Server_Port);  
	
}

//获取文件内容  
bool CUpload::Read_FileInfo(char **buffer,LPCSTR file)     
{     
  FILE *fp = fopen(file, "rb");   
  if(fp==NULL)  
  {  
	  return false;  
  }  
  fseek(fp, 0, SEEK_END);     
  l_file_len = ftell(fp);     
  rewind(fp);     
  *buffer = new char[l_file_len + 1];     
  memset(*buffer, 0, l_file_len + 1);      
  fseek(fp, 0, SEEK_SET);  
  fread(*buffer, sizeof(char), l_file_len, fp);  
  fclose(fp);    
  return true;  
}  
/*string*/ CString CUpload::MakeRequestHeaders(CString &strBoundary)//包头
{
	CString strFormat;
	CString strData;
	strFormat = _T("Content-Type:multipart/form-data;boundary=%s\r\n");//二进制文件传送Content-Type类型为: multipart/form-data
	string data_0="Content-Type:multipart/form-data;boundary=-----------------------------7b4a6d158c9";
	string data_1="\r\n";
	strData.Format(strFormat, strBoundary);
 	return strData;
	/*string data_info=data_0+data_1;
	return data_info;*/
}

/*string*/ CString CUpload::MakePreFileData(CString &strBoundary, CString &strFileName, int iRecordID)
{
	/**/
	//Content-Type:
	//JPG image/pjpeg
	//PNG image/x-png
	//BMP image/bmp
	//TIF image/tiff
	//GIF image/gif
	CString strFormat;
	CString strData;
	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"para1\"");//传给网络上的参数,根据网站抓包查看到底是需要哪些
	strFormat += _T("\r\n\r\n");
	strFormat += _T("my name is xiaoxiong");
	strFormat += _T("\r\n");

	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"para2\"");
	strFormat += _T("\r\n\r\n");
	strFormat += _T("sdfasd");//国软件研究所
	strFormat += _T("\r\n");

	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"trackdata\"; filename=\"%s\"");//文件地址信息
	strFormat += _T("\r\n");
	strFormat += _T("Content-Type: image/pjpeg");

	strFormat += _T("\r\n\r\n");
	strData.Format(strFormat,  strBoundary, strBoundary, strBoundary, strFileName);//
	int szie=strData.GetLength();
	return strData;

	
}

CString CUpload::MakePostFileData(CString &strBoundary)//发送请求包
{
	CString strFormat;
	CString strData;

	strFormat = _T("\r\n");	
	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"submitted\"");
	strFormat += _T("\r\n\r\n");
	strFormat += _T("hello");
	strFormat += _T("\r\n");
	strFormat += _T("--%s--");
	strFormat += _T("\r\n");
	strData.Format(strFormat, strBoundary, strBoundary);
	return strData;
}

//文件上传  
bool CUpload::UploadFile(LPCTSTR lpszServer,LPCTSTR lpszAddr,LPCTSTR fileUrl,int Server_Port)     
{  
	CString _mFilePath;
	_mFilePath = fileUrl;//要传的本地文件地址
	int startp = _mFilePath.ReverseFind('\\');
	int namelen = _mFilePath.GetLength()-startp-1;
	CString pcmname = _mFilePath;//.Mid(startp+1,namelen);
	CString defServerName =lpszServer;//服务器名
	CString defObjectName =lpszAddr;//保存的地址
	// USES_CONVERSION;
	CInternetSession Session;
	CHttpConnection *pHttpConnection = NULL;
	INTERNET_PORT   nPort = Server_Port/*8076*/;
	CFile fTrack;
	CHttpFile* pHTTP;
	CString strHTTPBoundary;
	CString strPreFileData;
	CString strPostFileData;
	DWORD dwTotalRequestLength;
	DWORD dwChunkLength;
	DWORD dwReadLength;
	DWORD dwResponseLength;
	TCHAR szError[MAX_PATH];
	void* pBuffer;
	LPSTR szResponse;
	CString strResponse;
	bool bSuccess = true;

	CString strDebugMessage;

	if (FALSE == fTrack.Open(_mFilePath, CFile::modeRead | CFile::shareDenyWrite))//读出文件 
	{
		return FALSE;
	}
 
	int iRecordID = 1;
	strHTTPBoundary = _T("---------------------------7b4a6d158c9");//定义边界值
	strPreFileData = MakePreFileData(strHTTPBoundary, pcmname, iRecordID);
	strPostFileData = MakePostFileData(strHTTPBoundary);
	int size_file= fTrack.GetLength();
	int PostFileDta_Size=strPostFileData.GetLength() ;
	int PreFileData= strPreFileData.GetLength();
	dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + fTrack.GetLength();//计算整个包的总长度
	dwChunkLength = 64 * 1024;
	pBuffer = malloc(dwChunkLength);
	if (NULL == pBuffer)
	{
		return FALSE;
	}
	try
	{
		pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
		pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
		CString str=MakeRequestHeaders(strHTTPBoundary);
		pHTTP->AddRequestHeaders(str);//发送包头请求
		pHTTP->SendRequestEx(dwTotalRequestLength/*, HSR_SYNC | HSR_INITIATE*/);
USES_CONVERSION;
#ifdef _UNICODE
       // WideCharToUTF8((LPCWSTR)(LPCTSTR)strPreFileData,strPreFileData.GetLength());
		pHTTP->Write(W2A(strPreFileData), strPreFileData.GetLength());
		//pHTTP->Write(m_lpUTF8,m_nUTF8Len);
#else
		pHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());//写入服务器所需信息
#endif
	   dwReadLength = -1;
	   size_t length=-1;
	   char *file_info;
	   char *info=new char[dwChunkLength];
	   while (0 != dwReadLength)
	   {
		   strDebugMessage.Format(_T("%u / %u\n"), fTrack.GetPosition(), fTrack.GetLength());
		   TRACE(strDebugMessage);
		   dwReadLength = fTrack.Read(pBuffer, dwChunkLength);//文件内容
		   if (0!=dwReadLength)
			{
				pHTTP->Write(pBuffer,dwReadLength);//写入服务器本地文件,用二进制进行传送
			}
	 	}
#ifdef _UNICODE
		 pHTTP->Write(W2A(strPostFileData.GetBuffer()), strPostFileData.GetLength());
#else
		pHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endif
		pHTTP->EndRequest(HSR_SYNC);
		dwResponseLength = pHTTP->GetLength();
		while (0 != dwResponseLength)
		{
			szResponse = (LPSTR)malloc(dwResponseLength + 1);
			szResponse[dwResponseLength] = '\0';
			pHTTP->Read(szResponse, dwResponseLength);
			strResponse += szResponse;
			free(szResponse);
			dwResponseLength = pHTTP->GetLength();
		}
	} 
	
	catch (CException* e)
	{
		e->GetErrorMessage(szError, MAX_PATH);
		e->Delete();
		bSuccess = false;
	}

	pHTTP->Close();
	delete pHTTP;

 	fTrack.Close();
	 
	if (NULL != pBuffer)
	{
		free((void*)pBuffer);
	}
	return bSuccess;
	///
}  
 
  
//将宽字符转为UTF-8
void CUpload::WideCharToUTF8(LPCWSTR wpWideData, int WideLen)
{
	//如果原先的数据没有删除
	if (m_lpUTF8)
	{
		delete [] m_lpUTF8;
		m_lpUTF8 = NULL;
	}
	m_nUTF8Len = WideCharToMultiByte(CP_UTF8,0,wpWideData,WideLen,NULL,0,NULL,NULL);
	m_lpUTF8 = new char[m_nUTF8Len + 1];
	m_lpUTF8[m_nUTF8Len] = 0;
	WideCharToMultiByte(CP_UTF8,0,wpWideData,WideLen,m_lpUTF8,m_nUTF8Len,NULL,NULL);

}
<pre name="code" class="cpp">//例如上传test.zip到指定的网址
	str_ServerUrl="www.test.com";
	str_ServerAddr="/Upload.aspx";
	Server_Port=8076;
	zip_name=L"test.zip";
 	m_upload.Send_File(str_ServerUrl,str_ServerAddr,Server_Port,zip_name);



                
### 回答1: lwip http client是一个轻量级的网络协议栈,主要用于实现TCP/IP协议。其中,http client是lwip中的一个模块,它提供了HTTP客户端的功能,可以与服务器进行HTTP协议的通信。 lwip http client模块支持多种HTTP请求方法,例如GET、POST、HEAD等,并提供了丰富的API接口,方便开发者自定义http请求和响应的参数。开发者可以通过lwip http client模块实现网络应用程序,例如浏览器、文件传输下载等。 使用lwip http client模块需要在应用程序中连接服务器。lwip http client模块提供了ssl支持,因此可以实现安全的https通信。在通信过程中,lwip http client模块会对请求和响应进行解析,并提供相应的回调函数,以便应用程序对响应结果进行处理。 可以说,lwip http client是一个非常实用的模块,具有较高的可移植性和灵活性,可在嵌入式系统和其他资源受限的设备上使用。在实际的开发过程中,开发者可以利用其优良的性能和丰富的API接口,快速构建出高效、安全的网络应用程序。 ### 回答2: LWIP是一个轻量级的TCP/IP协议栈,涵盖了TCP、UDP、IP、ICMP、ARP、DNS和DHCP等协议。LWIP还提供了HTTP客户端功能,使得用户可以通过发送HTTP请求来与Web服务器进行通信,并获取相应的HTTP响应数据。 LWIP的HTTP客户端支持GET、POST和HEAD等HTTP请求方法,同时也支持Cookie、Basic Authentication和TLS等协议,可以满足用户的基本需求。用户可以通过LWIP提供的API接口来发送HTTP请求,并通过回调函数来处理相应的HTTP响应数据。 LWIP的HTTP客户端也支持并发请求,即多个HTTP请求可以同时发送和接收响应,提高了通信效率。此外,LWIP还提供了HTTP Keep-Alive功能,可以保持TCP连接的开启状态,使得客户端和服务器之间的数据传输更加高效稳定。 总的来说,LWIP的HTTP客户端提供了一种简单可靠的通信方式,方便用户与Web服务器进行数据交互,为嵌入式系统开发提供了良好的支持。 ### 回答3: lwip是嵌入式领域中流行的一个轻量级IP协议栈,它在网络通信中发挥了重要作用。lwip http client则是lwip中提供的一种HTTP客户端功能,可以很方便地通过HTTP协议与Web服务器进行通信,实现信息的获取和上传。 lwip http client的使用非常简单,只需要按照一定的步骤进行配置和调用即可完成HTTP通信操作。首先,需要在lwip的配置文件中选择启用HTTP client功能,并设置HTTP客户端的缓存大小、超时时间等参数,以适应不同的应用场景。接着,需要调用lwip封装好的httpc_request()函数,指定要访问的URL地址、HTTP方法、请求头信息等参数,发送HTTP请求。最后,httpc_request()函数会返回HTTP服务器的响应内容,由应用程序进行解析和处理。 除了基本的HTTP GET和POST请求外,lwip http client还支持SSL/TLS等安全传输协议,可以使用HTTPS协议与服务器进行保密通信,确保敏感信息的安全。同时,lwip http client还支持HTTP chunked编码、gzip压缩等特性,能够在保证效率的前提下,进一步优化HTTP通信的性能。 总之,lwip http client作为一个轻量、简单、可靠的HTTP客户端,为嵌入式设备的网络通信提供了强有力的支持,是嵌入式应用开发中的重要组成部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值