2 qq 28396927 qq_28396927 于 2015.07.09 09:55 提问

关于写一个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);
}

4个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.09 10:53

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

qq_28396927
qq_28396927 回复oyljerry: 我的意思是服务器把数据传完了之后,没有数据到达,而ssl_read函数还不知道,所以阻塞了,不知到是不是这个原因。现在是程序执行的while里面没出来
2 年多之前 回复
oyljerry
oyljerry 回复qq_28396927: 如果是数据没有到来,那服务端返回的数据去哪了?但你其他工具又完整,看上去服务端还是返回了。
2 年多之前 回复
qq_28396927
qq_28396927 其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,文件的缺失。 目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有除了执行fclose, 我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里
2 年多之前 回复
qq_28396927
qq_28396927   2015.07.09 11:19

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

qq_28396927
qq_28396927   2015.07.09 11:19

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

qq_28396927
qq_28396927   2015.07.09 11:20

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

Csdn user default icon
上传中...
上传图片
插入图片