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

关于写一个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
    oyljerry 2015-07-09 02:53

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

    点赞 评论
  • qq_28396927
    qq_28396927 2015-07-09 03:19

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

    点赞 评论

相关推荐