fflush函数-关于写一个https客户端在指定位置读取文件内容

问题描述

关于写一个https客户端在指定位置读取文件内容
在代码段最后的while循环中,用SSL_read函数读取文件远程的内容,但是内容读取后,总有小部分内容的缺失,while程序执行完后,并没有执行while之后的内容,

程序运行到这里就不运行了

 int main(int argc char *argv[]){    int sock_fd ret;    struct sockaddr_in server_addr;    char requestBuffer[2048]={0};    char responseBuffer[2048]={0};    SSL *ssl;    SSL_CTX *ctx;    FILE *fp;    /*创建套接字*/    if((sock_fd=socket(AF_INET SOCK_STREAM 0))==-1)    /*填充服务器资料*/    bzero(&server_addr sizeof(server_addr));    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(PORT);    if(inet_pton(AF_INET IP &server_addr.sin_addr)<=0)    {    fprintf(stderr创建网络连接失败!n"");    exit(1);    }    else    {    fprintf(stdout创建网络连接成功!n"");    }    /*连接服务器*/    if((connect(sock_fd (struct sockaddr*)&server_addr sizeof(struct sockaddr)))==-1)    {    fprintf(stderr连接服务器失败!n"");    }    else    {    fprintf(stdout连接服务器成功!n"");    }     /* SSL初始化 */    SSL_library_init();    SSL_load_error_strings();    ctx = SSL_CTX_new(SSLv23_client_method());    if (ctx == NULL) {        ERR_print_errors_fp(stderr);        exit(1);    }    ssl = SSL_new(ctx);    if (ssl == NULL) {        ERR_print_errors_fp(stderr);        exit(1);    }    /* 把socket和SSL关联 * */    ret = SSL_set_fd(ssl sock_fd);    if (ret == 0) {        ERR_print_errors_fp(stderr);        exit(1);    }    RAND_poll();    while (RAND_status() == 0) {        unsigned short rand_ret = rand() % 65536;        RAND_seed(&rand_ret sizeof(rand_ret));    }    ret = SSL_connect(ssl);    if (ret != 1) {        ERR_print_errors_fp(stderr);        exit(1);    }    /*发送request*/#ifdef AOP_SESSIONS_TEST    char request[2048];    int requestLenght=0;    memset(request 0 2048);    getSessionsRequest(request);    requestLenght=strlen(request);    fprintf(stdoutAOP Sessions的http报文长度为:%dn"" requestLenght);    strncpy(requestBuffer request requestLenght);#else    int requestLenght=0;    requestLenght=strlen(REQUEST);    strncpy(requestBuffer REQUEST requestLenght);    fprintf(stdoutGET的http报文长度为:%dn"" requestLenght);#endif    fprintf(stdoutrequest的内容为n:%sn"" requestBuffer);    if((SSL_write(ssl requestBuffer requestLenght))<0)    {    fprintf(stdout发送request失败!n"");    }    else    {    fprintf(stdout发送request成功!n"");    }    /*接受response*/    int nbytes=0;    fp=fopen(""fw.bin""w+"");    if(!fp)    {    fprintf(stdout文件未成功打开!n"");    exit(0);    }    else    {    fprintf(stdout文件打开成功!n"");    }    int i=0;    while((nbytes=SSL_read(ssl responseBuffer 1))==1)    {       if(i<4)    {        if(responseBuffer[0]=='r' || responseBuffer[0]=='n')        {        i++;        }        else        {        i=0;        }        printf(responseBuffer);    }    else    {        fwrite(responseBuffer 1 1 fp);        i++;        fprintf(stdouti:%dn"" i);        if(i%256==0)        {        fflush(fp);        }    }    }    fclose(fp);    ret = SSL_shutdown(ssl);    if (ret != 1) {        ERR_print_errors_fp(stderr);        exit(1);    }    close(sock_fd);    SSL_free(ssl);    SSL_CTX_free(ctx);    ERR_free_strings();    exit(0);}

解决方案

先用别的工具直接下载服务器端的文件,看能否下载完整的
其次就是你的客户端循环读取数据,是否长度处理正确。

解决方案二:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里

解决方案三:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里

解决方案四:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里

时间: 2024-12-16 22:22:14

fflush函数-关于写一个https客户端在指定位置读取文件内容的相关文章

c++写一个循环来查找指定进程 不知道该怎么写?求代码

问题描述 c++写一个循环来查找指定进程 不知道该怎么写?求代码 c++写一个循环来查找指定进程 不知道该怎么写?求代码 网上找了不少资料单老是编译出错 求大神指点 解决方案 用CreateToolhelp32Snapshot 参考:http://blog.csdn.net/zhongbin104/article/details/7867309 解决方案二: BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe) { // 采

e ++-用eclipse写一个程序,编辑OMNet++的.ini文件,并借助OMNeT++运行仿真

问题描述 用eclipse写一个程序,编辑OMNet++的.ini文件,并借助OMNeT++运行仿真 如何在eclipse里创建.编辑OMNeT++的.ini文件(也就是为仿真初始化参数),并运行OMNeT++仿真. 换句话说,用eclipse做一个OMNeT++的用户接口,给OMNeT++再封装一层.

iframe标签怎么讲一个jsp界面插入到另一个jsp界面的指定位置

问题描述 iframe标签怎么讲一个jsp界面插入到另一个jsp界面的指定位置 我用iframe标签不能够实现将下面红色图片中的内容,放入上面图片的黄色区域,请问怎么才能办到呢 解决方案 再你上面的form里添加一个叫target的属性 指向你iframe的名字 然后action里返回页面是下面那个jsp 然后就可以了

用函数模板,写一个简单高效的 JSON 查询器的方法介绍_javascript技巧

JSON可谓是JavaScript的亮点,它能用优雅简练的代码实现Object和Array的初始化.同样是基于文本的数据定义,它比符号分隔更有语义,比XML更简洁.因此越来越多的JS开发中,使用它作为数据的传输和储存. JS数组内置了不少有用的方法,方便我们对数据的查询和筛选.例如我们有一堆数据: 复制代码 代码如下: var heros = [        // 名============攻=====防=======力量====敏捷=====智力====        {name:'冰室女巫

我正在用C#写一个邮件客户端程序,不知道如何下手,请高手帮忙!!

问题描述 如题,提供源码也可.但要全.邮箱sxliang04@163.com谢谢!! 解决方案 解决方案二:http://www.blogjava.net/blogpig/archive/2006/10/21/76581.html

如何写一个主函数去调用这个函数,求指导

问题描述 如何写一个主函数去调用这个函数,求指导 bool imageSubtract(IplImage* src IplImage* dst){ int row = 0;//行 int col = 0;//列 uchar* pSrcData = NULL; uchar* pDstData = NULL; int stepSrc = 0; int stepDst = 0; if (!src || !dst){ return 0;}if ((src->height != dst->height)

rtec tudio 9-求大师帮助!!用matlab写一个导出ply格式文件的函数

问题描述 求大师帮助!!用matlab写一个导出ply格式文件的函数 matlab写一个导出ply格式文件的函数,使得导出的ply能被Artec Studio 9 读取并显示成三维模型

哈夫曼树 c++-提问:要写一个关于哈夫曼树的头文件,里面应该包括什么内容?

问题描述 提问:要写一个关于哈夫曼树的头文件,里面应该包括什么内容? 要写一个哈夫曼树的头文件,里面有左子,右子,父结点,权值还应该有什么???请大家帮忙,谢谢!! 解决方案 http://blog.csdn.net/hackerain/article/details/6011110 从这个里面提取出来方法和变量

tcpip-写一个包含十个tcp包的pcap文件,出现多余的malformed packet:ethernet

问题描述 写一个包含十个tcp包的pcap文件,出现多余的malformed packet:ethernet pcap文件头没有写错的:然后就是一个接一个的packet,每个packet我是这样写的:timestamp+以太网报头+IP报头+TCP报头+22个空字节(这22个空字节也是我试了很多次才试出来的,写多或者写少时,wireshark都会报错,并且只会显示一个包,而不是10个),具体些每个packet的代码如下: for (int i = 0; i < 10; i++){ myPacke