qq_28396927 2015-07-09 01:55 采纳率: 0%
浏览 1910

关于写一个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(stdout, "AOP Sessions的http报文长度为:%d\n", requestLenght);
    strncpy(requestBuffer, request, requestLenght);
#else
    int requestLenght=0;
    requestLenght=strlen(REQUEST);
    strncpy(requestBuffer, REQUEST, requestLenght);
    fprintf(stdout, "GET的http报文长度为:%d\n", requestLenght);
#endif
    fprintf(stdout, "request的内容为\n:%s\n", 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(stdout, "i:%d\n", 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);
}
  • 写回答

2条回答

  • oyljerry 2015-07-09 02:53
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)