我想用C/C++编写一个程序,它将动态地读取一个网页并从中提取信息.举个例子想象一下,如果你想写一个应用程序来关注并记录一个ebay拍卖.抓住网页有简单的方法吗?提供此功能的库?是否有一种简单的方法来解析页面以获取特定数据?
如何从我的C++程序中打开URL?
在红宝石中你可以做到
%x(open https://google.com)
Run Code Online (Sandbox Code Playgroud)
什么是C++中的等价物?我想知道是否有一个独立于平台的解决方案.但如果没有,我更喜欢Unix/Mac :)
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <fstream>
int main (int argc, char *argv[])
{
char url[1000] = "https://www.google.com";
std::fstream fs;
fs.open(url);
fs.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 关于标题问题,我有一个问题.所以,我正在尝试创建一个程序,它在C++程序和运行Apache Web服务器的PHP站点之间传递数据/数据请求.
我一直在研究Socket通信,但我不理解这个概念.我理解如何在PHP中创建套接字,在c ++中创建另一个套接字,并让我们使用测试应用程序运行它们.但只是单独的,不是互相交谈或与我的网络服务器交谈(PHP目前不在服务器上,它在不同的服务器上).那么这是如何工作的呢?根据我的理解,你需要一个人听一个端口号,另一个人要发一些东西给那个命令.
理想情况下,我宁愿不使用任何库来帮助我实现这一目标.我知道这个问题以前曾被问过多次,但我仍然无处可去.
有人可以提供上述工作原理的解释,或链接到这里/其他地方可能有帮助的问题吗?或者,如果有比使用套接字更好的方法吗?他们会互相交谈,速度可能是一个问题.
编辑,进一步说明:
Web服务器:我正在运行Apache Web服务器.PHP脚本位于此服务器上.
C++位置:在测试时,我的c ++应用程序存储在运行Web服务器的Raspberry Pi上.在实际应用程序中,我的C++应用程序仍将存储在同一设备上(但它不会是Raspberry Pi - 尽管仍然基于Linux).
通信:需要通过C++脚本触发PHP脚本来执行操作,反之亦然.他们需要两种方式都需要传递数据(通用数据结构,但它们可能相当大)(因此两者都需要能够发送和接收数据).
我希望能够用C++下载URL.简单的事情:
std::string s;
s=download("http://www.example.com/myfile.html");
理想情况下,这将包括以下URL:
我在Boost中使用asio,但它似乎没有处理ftp和https等协议的代码.现在我发现QT有更多我需要的东西(http://doc.trolltech.com/2.3/network.html).
切换到Qt是很诱人的,但它似乎有点沉重,并且与很多Boost功能相交叉.是否值得学习另一个API(Qt)或者Boost能做的比我想象的要多吗?
在将此标记为冗余之前,请注意我已经尝试了很多在Web上发布的方法(包括堆栈溢出),并且它们都无法满足我的需求.另外请注意我对编程世界很陌生,所以请原谅我滥用技术术语.
现在我正在编写一个C++程序来计算用户计算机中的一些数据(例如IP地址),然后我将IP地址发送到已经设置的服务器.我通过URL执行此操作.例如,如果服务器位于http://stack1234abcdz.com,并且用户的IP地址是100.100.100.100,那么我会请求
http://stack1234abcdz.com/?ip="100.100.100.100
Run Code Online (Sandbox Code Playgroud)
我已经尝试了libcurl并且它在某种程度上有效,但是在编译之后,我需要在与.exe相同的目录中使用5.dll才能运行它,由于我的问题的一些可移植性,我不能拥有它.
我也尝试了一些其他传统的套接字方法,但是它们需要大量的库和SDK,这些库很难配置,而且它们经常让像我这样的新手淹没.我需要做的是非常简单(我甚至不需要服务器发回任何东西,除了可能成功或失败代码),因此我认为我不需要这么多来做这么多.
我在Windows 7(64位)机器上使用Visual Studio 2006,做C++.我不能使用更新的版本,因为给我的大多数其他代码都在VS2006中,并且它们不能很好地转换/转换为更新的版本.
我想我现在要问的是接下来要做什么.有没有办法使用libcurl使可执行文件不使用5 .dll?我在某个地方看到我必须做一些静态连接的东西,但它们并不是非常具体.
或者是否有更简单的方法来解决我忽略的问题?WinInet的?CAtlHttpClientT?卡萨布兰卡?我不想安装和配置我尚未理解的复杂库,特别是我的问题的大小...
非常感谢有关此事的任何帮助/意见/反馈,谢谢!
我想知道如何用C++中的POCO对URL进行请求(例如下载图片并保存)?
到目前为止,我得到了这个小代码
#include <iostream>
#include <string>
#include "multiplication.h"
#include <vector>
#include <HTTPRequest.h>
using std::cout;
using std::cin;
using std::getline;
using namespace Poco;
using namespace Net;
int main() {
HTTPRequest *test = new HTTPRequest("HTTP_GET", "http://www.example.com", "HTTP/1.1");
}
Run Code Online (Sandbox Code Playgroud) 因此,我正在考虑将 HyperLedger Fabric 与我用 C++ 编写的应用程序一起使用。根据我的理解,交互,即发布检索数据都是在chaincode中完成的,在我看到的所有示例中,这是通过使用 CLI 接口 docker 容器调用的。
我只是希望能够将我的应用程序生成的数据存储在区块链上。
我的问题是如何从外部调用链码,当然这是可以做到的。我看到有一个 REST SDK,但它不再受支持,所以我不想接近它,说实话。还有什么其他选择?
谢谢!
c++ blockchain hyperledger hyperledger-fabric ibm-blockchain
尝试使用libcurlpp(libcurl的C++包装器)发布表单并获取响应.这一切都有效,但我不知道如何在http事务完成后以编程方式访问curlpp :: Easy对象的响应.Bascially:
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
...
curlpp::Easy foo;
foo.setOpt( new curlpp::options::Url( "http://example.com/" ) );
foo.setOpt( new curlpp::options::Verbose( true ) );
...many other options set...
foo.perform(); // this executes the HTTP transaction
Run Code Online (Sandbox Code Playgroud)
当这段代码运行时,因为Verbose设置为trueI我可以看到响应得到输出到STDOUT.但是如何获得完整的响应而不是将其转储到STDOUT?curlpp :: Easy似乎没有任何方法可以访问响应.
谷歌有很多点击,人们问同样的问题,但没有回复.curlpp邮件列表是一个死区,curlpp网站的API部分已经被打破了一年.
在过去的 6 个月里,我一直在自学 C++,我想把我学到的一点知识放到一个相对有用的程序中。我想制作一个程序来要求输入,(这是棘手的部分)在网站列表(包括所述网站中的其他页面)中搜索该输入的值并显示结果。事实是,我真的不知道如何开始,因为我没有阅读任何关于 c++ 和网络的指南,所以如果你有一个好的指南,请与我分享,非常感谢。
编辑:对不起,我不够清楚,程序本身并不是真正让我担心的,我只是在寻找解释如何结合 C++ 和网络的指南。我希望它像一个价格比较程序,从用户那里获取输入,在网站列表中搜索输入,得到结果,寻找它的价值并以递增的顺序显示结果
我通过发出http请求并读取响应头来获取一些带有套接字的网站,如下所示:
char buffer[1000];
while ((bytesReceived = tcpSocket.Receive(buffer, 1000-1)) > 0)
{
buffer[bytesReceived] = '\0';
myFile << buffer;
memset(buffer, 0, 1000);
}
Run Code Online (Sandbox Code Playgroud)
这是接收功能:
int fsx::TcpSocket::Receive(char* _buffer, size_t _length)
{
int iResult = recv(this->socketHandler, _buffer, _length, 0);
if (iResult >= 0)
{
return iResult;
}
else
{
return SOCKET_ERROR;
}
}
Run Code Online (Sandbox Code Playgroud)
而这部分响应我得到:
HTTP/1.1 200 OK
Date: Tue, 22 Sep 2015 10:46:10 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d01e9db42c5332c444d5105c2cd9fd9e01442918769; expires=Wed, 21-Sep-16 10:46:09 GMT; path=/; domain=.stackoverflow.com; HttpOnly
Cache-Control: public, no-cache="Set-Cookie", max-age=60 …Run Code Online (Sandbox Code Playgroud) c++ ×9
http ×4
sockets ×3
c ×2
libcurl ×2
request ×2
apache ×1
blockchain ×1
curlpp ×1
hyperledger ×1
networking ×1
php ×1
unix ×1
url ×1