https只能收到部分http头信息,急急急!

liujiadegongzi 2010-09-04 03:24:30
走的是https+xml格式,但发送请求后,只收到部分http头信息,现在收到的字节数为178,报文内容如下:

HTTP/1.1 200 OK

Date: Sat, 04 Sep 2010 06:34:45 GMT

Server: Apache/2.2.12 (Unix) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8b

Content-Length: 617

Connection: close

Content-Type:




代码如下:

BEGIN----------------------------------------------------------------
/*初始化*/
OpenSSL_add_ssl_algorithms();
/*为打印调试信息作准备*/
SSL_load_error_strings();

/*指定通讯协议(SSLv2/SSLv3/TLSv1)*/
meth = SSLv23_client_method();
/*申请一个会话环境:一个SSL上下文结构*/
ctx = SSL_CTX_new(meth);
。。。
/*验证服务器与否:SSL_VERIFY_NONE;SSL_VERIFY_PEER*/
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);
/*加载受信任的ca证书库,用于检查服务器证书合法性*/
SSL_CTX_load_verify_locations(ctx,((String)strPath+"\\ssl\\test.pem").c_str(),NULL);

/*构建随机数生成机制*/
srand( (unsigned)time( NULL ) );
for( int i = 0; i < 100; i++ )
seed_int[i] = rand();
RAND_seed(seed_int, sizeof(seed_int));

/*socket 套接字处理 .............................. */
sd = socket (AF_INET, SOCK_STREAM, 0);
...

memset (&sa, '\0', sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr("211.139.191.240"); /* Server IP */
sa.sin_port = htons(8443); /* Server Port number */
err = connect(sd, (struct sockaddr*)&sa, sizeof(sa));

/*开始 SSL 握手过程*/
ssl = SSL_new (ctx);
/*绑定读写套接字*/
SSL_set_fd (ssl, sd);
/*握手*/
err = SSL_connect(ssl);

/*打印所有加密算法的信息*/
SSL_get_cipher(ssl);
/*提取出服务器的证书信息*/
server_cert = SSL_get_peer_certificate(ssl);
str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
/*X509_get_issuer_name:得到证书签署者(往往是CA)的名字*/
str = X509_NAME_oneline(X509_get_issuer_name(server_cert),0,0);
/*将服务器证书释放 */
X509_free (server_cert);


/*用SSL_write,SSL_read代替write,read函数读写 */
printf("%s\n",strReq);
err = SSL_write(ssl, strReq, strlen(strBuff));
err = SSL_read(ssl, strRsp, 1024);
printf("\n%s",strRsp);
END------------------------------------------------------------------
...全文
395 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmmkele 2010-10-14
  • 打赏
  • 举报
回复
while(TRUE)
{
err = ssl_read();
if(err<=0)
break;
}
liujiadegongzi 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wjb_yd 的回复:]

接受http本来就应该是这个样子的,先收到http响应头,然后取出content-length字段,再取对应的长度。
[/Quote]

发现确实要包去读。
调用多家机构https接口,因为报文比较小,所以都可一次性可以读到,但这次读不到。

mymtom 2010-09-06
  • 打赏
  • 举报
回复
没有用过SSL_read, 只是猜测
err = SSL_read(ssl, strRsp, 1024);
这里是不是需要循环多次读啊? 单次读可能只收到部分报文。
FengRider 2010-09-06
  • 打赏
  • 举报
回复
一个包的容量有限的,所以通过HTTP协议获取指定URL数据时,不要期望一次READ就能够将所有的数据都获取到,而是要多次READ。
goodluckyxl 2010-09-06
  • 打赏
  • 举报
回复
用wireshark来检测一下是否传输是正确的?

解码之类的我对协议并不是很熟悉
但是这个工具能帮你搞一下的
wjb_yd 2010-09-06
  • 打赏
  • 举报
回复
接受http本来就应该是这个样子的,先收到http响应头,然后取出content-length字段,再取对应的长度。
justkk 2010-09-04
  • 打赏
  • 举报
回复
对于SSL_read()不了解,你是不是应该先获取整个报文的长度,上例是617(Content-Length: 617)
然后再读取报体啊。
不能指望SSL_read()一次读取所有的数据

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧