C++发送HTTP请求---亲测可行

本文介绍了一个使用Wininet.h库实现HTTP GET和POST请求的C++示例程序。该程序展示了如何创建HTTP连接、发送请求并读取响应内容。通过实际案例,读者可以了解到如何在Windows环境下利用Wininet.h进行网络通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://hi.baidu.com/benbearlove/item/1671c23017575825b3c0c53f

 

环境:xp sp3,vs2008,vs2010在静态库中使用 MFC

  1. #include <afxwin.h>   
  2. #include <stdio.h>   
  3. #include <windows.h>   
  4. #include <string>   
  5. #include "Wininet.h"   
  6. #pragma comment(lib,"Wininet.lib")   
  7.   
  8. //模拟浏览器发送HTTP请求函数   
  9. std::string HttpRequest(char * lpHostName,short sPort,char * lpUrl,char * lpMethod,char * lpPostData,int nPostDataLen)  
  10. {  
  11.     HINTERNET hInternet,hConnect,hRequest;  
  12.   
  13.     BOOL bRet;  
  14.   
  15.     std::string strResponse;  
  16.   
  17.     hInternet = (HINSTANCE)InternetOpen("User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);  
  18.     if(!hInternet)  
  19.         goto Ret0;  
  20.   
  21.     hConnect = (HINSTANCE)InternetConnect(hInternet,lpHostName,sPort,NULL,"HTTP/1.1",INTERNET_SERVICE_HTTP,0,0);  
  22.     if(!hConnect)  
  23.         goto Ret0;  
  24.   
  25.     hRequest = (HINSTANCE)HttpOpenRequest(hConnect,lpMethod,lpUrl,"HTTP/1.1",NULL,NULL,INTERNET_FLAG_RELOAD,0);  
  26.     if(!hRequest)  
  27.         goto Ret0;  
  28.   
  29.     //bRet = HttpAddRequestHeaders(hRequest,"Content-Type: application/x-www-form-urlencoded",Len(FORMHEADERS),HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);   
  30.     //if(!bRet)   
  31.         //goto Ret0;   
  32.   
  33.     bRet = HttpSendRequest(hRequest,NULL,0,lpPostData,nPostDataLen);  
  34.     while(TRUE)  
  35.     {  
  36.         char cReadBuffer[4096];  
  37.         unsigned long lNumberOfBytesRead;  
  38.         bRet = InternetReadFile(hRequest,cReadBuffer,sizeof(cReadBuffer) - 1,&lNumberOfBytesRead);  
  39.         if(!bRet || !lNumberOfBytesRead)  
  40.             break;  
  41.         cReadBuffer[lNumberOfBytesRead] = 0;  
  42.         strResponse = strResponse + cReadBuffer;  
  43.     }  
  44.   
  45.  Ret0:  
  46.     if(hRequest)  
  47.         InternetCloseHandle(hRequest);  
  48.     if(hConnect)  
  49.         InternetCloseHandle(hConnect);  
  50.     if(hInternet)  
  51.         InternetCloseHandle(hInternet);  
  52.   
  53.     return strResponse;  
  54. }  
  55.   
  56. void main()   
  57. {   
  58.     //CString strResponse = HttpRequest("translate.google.com",80,"/translate_t?langpair=en|zh-CN","POST","hl=zh-CN&ie=UTF-8&text=this is me&langpair=en|zh-CN",strlen("hl=zh-CN&ie=UTF-8&text=this is me&langpair=en|zh-CN"));   
  59.     std::string strResponse = HttpRequest("www.hao123.com",80,NULL,"GET",NULL,0);  
  60.     FILE * fp = fopen("C:\\123.htm","wb");  
  61.     fwrite(strResponse.c_str(),strResponse.length(),1,fp);  
  62.     fclose(fp);  

### C++ 实现 MEWTOCOL-COM 协议的可能性分析 尽管现有的资料主要集中在 C# 上位机与松下 PLC 的通信实现[^2],但 MEWTOCOL-COM 协议本身是一个通用的串口通信协议,其底层逻辑依赖于特定的语言环境。因此,在 C++ 中实现该协议也是完全可行的。 #### 1. **MEWTOCOL-COM 协议的核心特点** MEWTOCOL-COM 是一种专为串口通信设计的轻量级协议,支持多种基本操作,例如读取触点状态、修改数据寄存器等内容[^1]。其实现通常涉及以下几个方面: - 数据帧结构定义:包括起始符、命令码、目标地址、数据长度以及校验字段。 - 命令集解析:针对同的指令(如读写寄存器),需要按照协议规定的格式构造请求处理响应- 错误检机制:通过 CRC 或其他校验方法验证数据传输的有效性。 #### 2. **C++ 下的实现思路** 由于 C++ 提供了丰富的低层接口来操控硬件设备,比如使用 `CreateFile` 和 `WriteFile` 函数访问 COM 端口 (Windows 平台),或者借助 POSIX API (`open`, `read`, `write`) 完成相同任务 (*nix 系统)[^3]。以下是可能的技术路线: ##### a) 使用标准库完成基础 IO 操作 对于简单的应用场景可以直接依靠 STL 进行字符串拼接和流式输入输出管理;然而考虑到实时性和效率需求,则建议引入第三方框架辅助开发工作流程。 ```cpp #include <windows.h> // Windows-specific headers required here. #include <iostream> using namespace std; void sendCommand(HANDLE hComm, const char* cmd){ DWORD bytesWritten; WriteFile(hComm,cmd,strlen(cmd),&bytesWritten,NULL); } int main(){ HANDLE hSerial = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hSerial==INVALID_HANDLE_VALUE){return -1;} DCB dcb={sizeof(DCB)}; GetCommState(hSerial,&dcb); dcb.BaudRate=9600; // Set baud rate as per requirement. SetCommState(hSerial,&dcb); sendCommand(hSerial,"YOUR COMMAND STRING\r\n"); CloseHandle(hSerial); } ``` 上述代码片段展示了如何打开指定端口号,设置波特率参数以便发送自定义消息给连接的目标装置——这里是假设已经知道确切的消息格式情况下执行的动作序列之一部分而已。 ##### b) 高性能解决方案推荐 如果项目规模较大且追求更高的可维护性和扩展能力的话,那么可以考虑采用 Boost.Asio 库来进行异步网络编程方面的尝试。Boost.Asio 仅能够很好地适配跨平台特性而且提供了详尽文档指导用户快速入门复杂事件驱动模型下的程序架构搭建过程[^4]. 注意这里提到的内容未直接来源于所提供的三个具体链接参考资料列表里头所提及的部分而是基于个人经验总结得出结论仅供参考学习之用非绝对真理! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值