最近开发一个软件要进行对https的网站进行模拟登陆, 找了3个库进行测试, 包括wininet,curl和poco的netssl.
首先当然是测试微软的wininet,使用很简单,只要在HttpOpenRequest加入INTERNET_FLAG_SECURE属性即可,测试时,发现每次通讯都会建立一个socket,即使加入keepalive,使用http/1.1之类的都没有用,每次连接都会耗费大量时间在重建连接,在网上搜索了一下资料,有人说是加入了INTERNET_FLAG_IGNORE_CERT_CN_INVALID属性导致的,刚好偶要登陆的网站的证书已经过期了,不用这些参数根本没法登陆.只好放弃使用了.
然后就改用curl,这个库号称性能强大,不过编译还比较麻烦的,特别是加入openssl,多线程下还要自己加同步锁,在openssl网站上找很久才找到加锁的办法.测试时,连接都很快,不过一段时间后,当socket断开后,重连时,总没法重新使用原来的session id继续原来的通讯,必须重新建立session,重新登陆.在curl的网站上查了一下,也有人反映curl没法重新使用session id 的,不过也没有给出解决办法.郁闷.
最后测试poco net, 这个库还是不错的,代码都非常简练优美, 文档都很全,编译也很方便,很方便就加入openssl,单个帐户登陆时很正常,session id也能重用,可是当偶使用多线程多个帐户登陆时,时常会出现抛出SSLConnectionUnexpectedlyClosedException异常,这时再也无法重新建立连接,不知道是网站的问题,还是poco的问题还是openssl的问题,在poco的文档也没找到关于openssl加锁的说明.而且还有很多的内存泄漏,不知道是否是那个异常导致的,还有一部分的net库的一些全局变量的内存泄漏,这些都没有找到解决办法.
最后还是很头痛,到底用那个库还是个问题,只好继续找解决办法.