POCO::Net 简单的HTTPS程序

历时两周,整整两周,才把这个HTTPS的程序弄好,不知是笨还是什么的,谢天谢地,总算能发送了。
开始时走了很多弯路,一是POCO库下载了个阉割版本的,OpenSSL也下了个阉割版本的,搞的自己
奇怪了一两天,一直在国外网上找寻有用的信息。google都搜烂了。第一周过后,虽然能使用HTTP

发送程序了,却留下了HTTPS这个难题,只能下周才能慢慢解决了。

第二周,仔细阅读POCO官方的文档,发现POCO还有一个完全版,OpenSSL也有一个供开发者使用
的完全版,赶紧下下来,小心地编译,这次比较幸运,与前几次抓狂相比,Crypto模块和OpenSSL模块
成功的编译过去了,不过在编译相应的samples时出现了错误。

编译好后,果然可以使用HTTPSClientSession这个类了,用它赶快写了一个程序,结果一上来crash
_pInstance为空。赶快查询函数的注释,说:如果要使用OpenSSL库,则必须在任何使用它的类之前,初始化
它,用context,好吧,继续google,终于在一篇文章上找到了一个用例。抄一遍,仔细阅读下,发送成功了
不过收到的却是一个JavaScript脚本(这是错误的,应该收到一个XML数据)。用Qt做了个实验,收到同样
的数据,我以为是正确的了,就这样继续做其他的事了。余下的一两天都在弄经常报出的SSL异常,空指针
什么的。最终在周五,我发现了,那就是,我发送数据的目的地地址是错的,我一直在错的地址上做实验,
然后用正确的,又报SSL异常,最后最后的,改变了两个函数,收到了,正常的数据。这是一段难忘的经历
,它告诉我,做事一定要仔细,不要放过任何蛛丝马迹!

让我们来初略分析一下这个HTTPS小程序:

首先,得编译含有OpenSSL库的POCO库,下载Win32OpenSSL-1_0_1c.exe和poco-1.4.3p1-all.zip,exe
安装到C盘把,因为POCO编译的时候默认指定C盘根下,顺便在安装好后把文件夹名字改成OpenSSL。解压
zip到C盘把,图个方便,如果要改指定的OpenSSL路径,编辑buildWin.bat。添加INCLUE和LIB环境变量
(各自指向OpenSSL相应的目录)我用的的是VS2005.所以编译运行buildWin 80。

中途可能会遇到画面停留死都不动的地方,可能在什么DOMWriter地方,多按记下Ctrl+C,当然了要选N。

编译结束。

随便打开一个NetSSL_OpenSSL目录下的sample工程,把里面代码全注释了,然后就在这个工程写自己的程序.

Poco::Net::Context::Ptr m_context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false);//没搞懂这些参数,先这样写着
HTTPSClientSession session(m_context);
URI uri("服务器的域名或IP地址");
HTTPRequest request(HTTPRequest::HTTP_POST,"你要访问的目标在服务器上的路径");
session.setHost(uri.getHost());
session.setPort("服务器的端口");
session.sendRequest(request) << "要发送的数据";

HTTPResponse response;
std::istream& res = session.receiveResponse(response);
std::string str;//用作接受数据
res>>str;	//开始接受数据
session.reset();//重置会话,接待下次连接

完了,看似简单,唉,错一个参数,就会导致异常的发生,这对一个先接触Qt的我来说,情何以堪啊。很奇怪,
它这个地方的接受数据的方法是同步调用的,但看源代码的话,它里面是个do_while循环,可以理解了,同时,
你可以设置超时时间限制。点点滴滴,一言难尽,慢慢熟悉把。


你可能感兴趣的:(Poco,C++)